1. Trang chủ
  2. » Tất cả

19.Chuong 19

33 2 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

CHƯƠNG 19 Nhóm 6b: Ngơ Nguyễn Thanh Tùng Huỳnh Văn Thành KHẢ NĂNG MỞ RỘNG ĐIỀU KHIỂN Trong chương này, tơi cho bạn số tính tiên tiến MVC để làm việc với điều khiển Tôi bắt đầu chương cách khám phá phận trình xử lý yêu cầu dẫn đến việc thực phương pháp hành động thể cách khác để kiểm sốt Hình 19-1 cho thấy dịng chảy kiểm sốt thành phần Hình 19-1 Gọi phương thức hành động Phần đầu chương nhà máy sản xuất điều khiển hành động Tên thành phần đề nghị mục đích họ Các nhà máy sản xuất điều khiển chịu trách nhiệm cho việc tạo trường hợp điều khiển để phục vụ yêu cầu hành động Invoker chịu trách nhiệm cho việc tìm kiếm gọi phương thức hành động lớp điều khiển Các MVC Framework có mặc định triển khai hai thành phần, cho bạn thấy làm để cấu hình kiểm sốt hành vi họ Tơi cho thấy làm để thay thành phần hoàn toàn sử dụng logic tùy chỉnh Bảng 19-1 cung cấp tóm tắt cho chương Bảng 19-1 Chương Summary CHUẨN BỊ DỰ ÁN MẪU Trong chương , tạo dự án gọi ControllerExtensibility cách sử dụng tùy chọn template rỗng kích hoạt tùy chọn để thêm tài liệu tham khảo lõi MVC thư mục Tôi cần số điều khiển đơn giản để làm việc với chương , để tơi chứng minh loại khác tính mở rộng mà có sẵn Để có thiết lập , tơi tạo tập tin Result.cs Mơ hình thư mục sử dụng để xác định lớp Kết hiển thị Listing 19-1 Listing 19-1: Nội dung tập tin Result.cs Bước tạo thư mục / Views /Shared thêm nhìn gọi Result.cshtml Đây quan điểm tất phương thức hoạt động điều khiển làm , bạn xem nội dung tập tin Listing 19-2 Listing 19-2: Nội dung tập tin Result.cshtml Quan điểm sử dụng lớp kết mà tơi định nghĩa Listing 19-2 mơ hình hiển thị giá trị ControllerName ActionName Cuối , cần phải tạo số điều khiển Listing 19-3 cho thấy Điều khiển sản phẩm Listing 19-3: Nội dung tập tin Product Controller.cs Listing 19-4 diễn tả Điều khiển khách hang Listing 19-4: Nội dung tập tin CustomerController.cs Các điều khiển không thực hành động hữu ích khác để báo cáo họ gọi thông qua Result.cshtml THIẾT LẬP CÁC URL BAN ĐẦU Tôi muốn Visual Studio để bắt đầu với URL gốc cho ứng dụng đoán URL dựa tập tin chỉnh sửa.Chọn ControllerExtensibility Properties từ menu Project Studio Visual, chuyển sang Web kiểm tra tùy chọn trang cụ thể phần Bắt đầu hành động Bạn không cần phải cung cấp giá trị Chỉ kiểm tra tùy chọn đủ Tạo máy điều khiển tùy chỉnh Giống phần nhiều MVC Framework, cách tốt để hiểu cách điều khiển nhà máy làm việc để tạo tùy chỉnh triển khai Tôi không khuyên bạn làm điều dự án thực tế, có cách dễ dàng để tạo hành vi tùy chỉnh việc mở rộng nhà máy xây dựng Nhưng cách tốt đẹp để chứng minh làm khuôn khổ MVC tạo trường hợp điều khiển Nhà máy điều khiển xác định giao diện IControllerFactory, thể Listing 19-5 Listing 19-5: Giao diện IControllerFactory Trong phần tiếp theo, tạo nhà máy điều khiển tùy chỉnh đơn giản hướng dẫn bạn thông qua việc triển khai cho phương pháp giao diện IControllerFactory Để bắt đầu , tạo thư mục sở hạ tầng thêm file class gọi CustomControllerFactory.cs , mà sử dụng để tạo nhà máy điều khiển tùy chỉnh hiển thị Bảng Listing 19-6 Listing 19-6: Nội dung tập tin CustomControllerFactory.cs Các phương pháp quan trọng giao diện CreateController , mà MVC Framework gọi cần điều khiển để phục vụ yêu cầu Các tham số để phương pháp đối tượng RequestContext , cho phép nhà máy để kiểm tra chi tiết yêu cầu , chuỗi, có chứa giá trị điều khiển từ URL chuyển RequestContext lớp định nghĩa thuộc tính mơ tả Bảng 19-2 Bảng 19-2: Các thuộc tính RequestContext Một lý mà không khuyên bạn nên tạo điều khiển tùy chỉnh theo cách việc tìm kiếm lớp điều khiển web ứng dụng instantiating họ phức tạp Bạn cần để xác định vị trí điều khiển tự động liên tục đối phó với tất loại vấn đề tiềm năng, chẳng hạn disambiguating lớp có tên khơng gian tên khác nhau,trường hợp ngoại lệ nhà xây dựng nhiều Chỉ có hai điều khiển dự án ví dụ tơi nhanh chóng chúng trực tiếp, có nghĩa khó dây tên lớp thành nhà máy sản xuất điều khiển, rõ ràng khơng phải ý tưởng tốt cho dự án thực sự, cho phép tơi để bên ngồi số tiền lớn phức tạp Mục đích phương pháp CreateController tạo thể lớp điều khiển xử lý u cầu Khơng có giới hạn cách bạn làm điều Các quy tắc bạn phải trả lại đối tượng có thực Giao diện IController kết phương thức Các quy ước mà bạn thấy sách tồn cách nhà máy điều khiển mặc định viết.Như ví dụ, tơi thực công ước mã tơi: tơi nhận u cầu cho điều khiển, nối thêm Điều khiển để tên lớp, yêu cầu cho sản phẩm dẫn đến ProductController lớp phúc khởi tạo Bạn tự làm theo công ước MVC Framework bạn viết máy điều khiển để loại bỏ chúng tạo riêng bạn cho phù hợp với nhu cầu dự án bạn Tôi khơng nghĩ hợp lý để tạo cơng ước riêng bạn lợi ích nó, hữu ích để hiểu linh hoạt MVC Framework ĐỐI PHĨ VỚI CÁC ĐIỀU KHIỂN DỰ PHỊNG Nhà máy tùy chỉnh điều khiển phải trả lại thực giao diện IController kết từ Phương pháp CreateController, không, lỗi hiển thị cho người dùng Điều có nghĩa bạn cần phải có dự phịng vị trí cho yêu cầu bạn chế biến không nhằm vào điều khiển dự án bạn Bạn tạo sách bạn muốn để đối phó với tình trạng này: bạn định nghĩa điều khiển đặc biệt mà ám thơng báo lỗi, ví dụ, làm tơi có đồ theo u cầu để lớp điều khiển biết luôn tồn Khi tơi nhận u cầu mà khơng có đồ cho điều khiển dự án, nhắm mục tiêu ProductController Điều khơng phải điều hữu ích để làm dự án thực sự, chứng minh nhà máy có điều khiển hồn chỉnh linh hoạt cách yêu cầu giải thích Tuy nhiên, bạn cần phải biết làm điểm khác khung MVC vận hành Theo mặc định, MVC Framework chọn quan điểm dựa giá trị điều khiển liệu định tuyến, tên lớp điều khiển Vì vậy, ví dụ tơi, tơi muốn vị trí dự phịng để làm việc với điểm theo quy ước việc theo tên điều khiển tổ chức, cần phải thay đổi giá trị điều khiển định tuyến tính, này: requestContext.RouteData.Values ["controller"] = "Product"; Sự thay đổi gây MVC Framework để tìm kiếm quan điểm kết hợp với điều khiển dự phịng khơng điều khiển hệ thống định tuyến xác định dựa URL mà người dùng yêu cầu Có hai điểm quan trọng đây: thứ không nhà máy điều khiển có trách nhiệm cho phù hợp yêu cầu để điều khiển, thay đổi theo yêu cầu để thay đổi hành vi bước đường ống xử lý yêu cầu.Đây công cụ mạnh đặc tính quan trọng MVC Framework Điểm thứ hai bạn tự làm theo điều bạn muốn ước nhà máy điều khiển bạn, bạn cần phải biết cơng ước cho phận khác MVC Framework Và, thành phần khác thay với mã tùy chỉnh tốt (như chứng minh cho quan điểm Chương 20), có ý nghĩa để làm theo nhiều người số công ước cho phép thành phần phát triển sử dụng độc lập với LỚP ĐIỀU KHIỂN TỨC THÌ Khơng có quy định cách bạn tạo lớp điều khiển bạn, thực hành tốt để sử dụng giải phụ thuộc mà giới thiệu chương Điều cho phép bạn để giữ cho máy điều khiển tùy chỉnh bạn tập trung vào yêu cầu lập đồ để điều khiển lớp học, để lại vấn đề phụ thuộc tiêm để xử lý riêng cho tồn ứng dụng Bạn xem sử dụng lớp DependencyResolver để tạo điều khiển trường hợp: return targetType == null ? null : (IController)DependencyResolver.Current.GetService(targetType) ; Các tài sản DependencyResolver.Current tĩnh trả thực Giao diện IDependencyResolver, xác định phương pháp GetService Bạn vượt qua đối tượng System.Type để phương pháp có thể trở lại Có phiên mạnh mẽ đánh máy phương pháp GetService, tơi làm khơng biết loại tơi đối phó với trước, tơi sử dụng phiên trả đối tượng sau thực rõ ràng trường hợp để IController Chú ý: Chú ý không sử dụng trình giải phụ thuộc để giải vấn đề chặt khớp nối lớp Thay vào đó, tơi u cầu để tạo thể loại mà tơi định để kiểm tra phụ thuộc lớp điều khiển tuyên bố giải chúng Tôi không thiết lập Ninject chương này, điều có nghĩa resolver mặc định sử dụng đơn giản tạo trường hợp cách tìm nhà xây dựng khơng tham số gọi cho họ Tuy nhiên, cách xây dựng nhà máy sản xuất điều khiển để sử dụng lớp DependencyResolver, tơi đảm bảo tơi liên tục tận dụng nhiều phân giải phụ thuộc cao cấp Ninject thêm vào dự án TRIỂN KHAI THỰC HIỆN CÁC PHƯƠNG PHÁP GIAO DIỆN KHÁC Hai phương pháp khác giao diện IControllerFactory:  Phương pháp GetControllerSessionBehavior sử dụng MVC Framework để xác định xem phiên liệu nên trì điều khiển Tôi trở lại vấn đề "Sử dụng Sessionless Controllers" sau chương  Phương pháp ReleaseController gọi đối tượng điều khiển tạo CreateController khơng cịn cần thiết Trong thực ví dụ tơi, tơi kiểm tra để xem lớp thực giao diện IDisposable Nếu có, tơi gọi phương thức Dispose để giải phóng tài nguyên giải phóng Triển khai thực tơi phương pháp GetControllerSessionBehavior ReleaseController phù hợp cho hầu hết dự án sử dụng nguyên văn (mặc dù bạn nên đọc phần điều khiển sessionless sau để chắn bạn hiểu tùy chọn có sẵn) ĐĂNG KÝ MỘT MÁY ĐIỀU KHIỂN TÙY CHỈNH Tơi nói MVC Framework sử dụng máy điều khiển tùy chỉnh thông qua lớp ControllerBuilder Bạn cần phải đăng ký điều khiển nhà máy tùy chỉnh ứng dụng bắt đầu, có nghĩa sử dụng phương pháp Application_Start file Global.asax.cs, thể Listing 19-7 Listing 19-7 Đăng ký máy điều khiển tùy chỉnh tập tin Global.asax Khi nhà máy điều khiển đăng ký, chịu trách nhiệm xử lý tất yêu cầu mà ứng dụng nhận Bạn xem hiệu nhà máy tùy chỉnh cách khởi động ứng dụng Các trình duyệt yêu cầu URL gốc, ánh xạ tới điều khiển Trang chủ hệ thống định tuyến Các nhà máy tùy chỉnh xử lý yêu cầu cho chủ điều khiển cách tạo thể lớp ProductController , mà sản xuất kết thể hình 19-2 Hình 19-2 Sử dụng máy điều khiển tùy chỉnh LÀM VIỆC VỚI CÁC ĐIỀU KHIỂN MÁY BUILT-IN Tôi cho bạn làm để tạo máy điều khiển tùy chỉnh cách hiệu để chứng minh điều khiển nhà máy làm hoạt động Đối với hầu hết ứng dụng, nhiên, lớp nhà máy điều khiển tích hợp, gọi DefaultControllerFactory, hồn tồn phù hợp Khi nhận yêu cầu từ hệ thống định tuyến, nhà máy nhìn vào liệu định tuyến để tìm giá trị tài sản điều khiển cố gắng tìm lớp học ứng dụng Web đáp ứng tiêu chí sau đây:  Các lớp phải công khai  Các lớp phải cụ thể (không trừu tượng)  Các lớp thông số chung chung  Tên lớp phải kết thúc với Controller  Các lớp phải thực giao diện IController Lớp DefaultControllerFactory trì danh sách lớp học ứng dụng, khơng cần phải thực tìm kiếm yêu cầu đến Nếu lớp học phù hợp tìm thấy, sau thể tạo cách sử dụng điều khiển kích hoạt (Tơi trở lại vấn đề phần tới "Tùy chỉnh điều khiển DefaultControllerFactory"), cơng việc điều khiển hồn tất Nếu khơng có điều khiển phù hợp, sau yêu cầu không xử lý thêm Chú ý lớp DefaultControllerFactory sau mơ hình convention-over-configuration Bạn khơng cần phải đăng ký điều khiển bạn tập tin cấu hình, nhà máy tìm thấy chúng cho bạn Tất bạn cần làm tạo lớp đáp ứng tiêu chí mà nhà máy tìm kiếm Nếu bạn muốn tạo hành vi điều khiển nhà máy tùy chỉnh, bạn cấu hình thiết lập mặc định nhà máy ghi đè lên số phương pháp Bằng cách này, bạn xây dựng hành vi hữu ích convention-over-configuration mà khơng cần phải tái tạo nó, nhiệm vụ mà, tơi nói trước đó, phức tạp đau đớn Trong phần tiếp theo, cho bạn cách khác để điều chỉnh tạo điều khiển ƯU TIÊN NAMESPACES Trong Chương 16, cho bạn làm để ưu tiên nhiều không gian tên tạo tuyến đường Điều giải nhập nhằng Vấn đề điều khiển, nơi mà lớp điều khiển có tên cư trú không gian tên khác Nó DefaultControllerFactory xử lý danh sách không gian tên ưu tiên cho họ Mẹo ưu tiên toàn cầu ghi đè tuyến đường cụ thể ưu tiên Điều có nghĩa bạn xác định Áp dụng thuộc tính ghi đè tên hành động Điều có nghĩa URL mà trực tiếp nhắm vào phương pháp Danh sách không làm việc lâu hơn, thể hình 19-6 Hình 19-6 Sử dụng tên phương thức hành động thuộc tính ActionName áp dụng Có hai lý bạn muốn ghi đè lên tên phương thức theo cách này: Sau bạn chấp nhận tên hành động khơng pháp luật phương thức tên C # (ví dụ, [ActionName ("User-Đăng ký")]).Nếu bạn muốn có hai phương pháp C # khác mà chấp nhận tập hợp thông số nên xử lý hành động tương tự tên, để đáp ứng yêu cầu HTTP loại khác (ví dụ, với [HttpGet] khác với [HttpPost]), bạn cung cấp cho phương pháp tên C # khác để đáp ứng trình biên dịch, sau sử dụng [ActionName] để lập đồ hai đến tên hành động tương tự SỬ DỤNG PHƯƠNG PHÁP HÀNH ĐỘNG LỰA CHỌN Nó thường trường hợp điều khiển chứa vài hành động có tên Điều có nhiều phương pháp, với thơng số khác nhau, bạn sử dụng thuộc tính ActionName, nhờ nhiều phương pháp đại diện cho hành động tương tự Trong tình này, MVC Framework cần số trợ giúp lựa chọn hành động phù hợp để xử lý yêu cầu Các chế để làm điều gọi chọn phương pháp hành động Nó cho phép bạn xác định loại yêu cầu hành động sẵn sàng qui trình Bạn thấy ví dụ lựa chọn phương thức hành động bị hạn chế hành động cách sử dụng HttpPost thuộc tính tơi xây dựng ứng dụng SportsStore Tơi có hai phương pháp gọi Thanh toán điều khiển Cart tơi sử dụng HttpPost thuộc tính để số họ sử dụng cho yêu cầu HTTP POST, thể Listing 19-16 Listing 19-16 Sử dụng Attribute HttpPost Invoker hành động sử dụng phương pháp hành động để giải mơ hồ selectors lựa chọn hành động Trong Listing 19-16, có hai ứng cử viên cho hành động Checkout The Invoker ưu tiên cho hành động mà có chọn lọc Trong trường hợp này, HttpPost chọn đánh giá để xem yêu cầu xử lý Nếu có thể, phương pháp mà sử dụng Nếu không, sau phương pháp khác, khơng có thuộc tính, sử dụng Có xây dựng thuộc tính mà làm việc chọn lọc dùng cho loại khác yêu cầu HTTP: HttpPost cho yêu cầu POST, HttpGet cho yêu cầu GET, HttpPut cho yêu cầu PUT, Một thuộc tính xây dựng-in NonAction, mà cho invoker hành động mà phương pháp mà không coi phương pháp hành động hợp lệ khơng nên sử dụng Bạn xem áp dụng thuộc tính NonAction Listing 19-17, nơi tơi xác định phương pháp hành động Điều khiển khách hàng Listing 19-17 Sử dụng NonAction Selector CustomerController.cs file Phương pháp MyAction danh sách không coi phương pháp hành động, đáp ứng tất tiêu chí mà invoker trơng cho Điều hữu ích cho việc đảm bảo bạn không vạch trần hoạt động lớp điều khiển bạn hành động Tất nhiên, phương pháp thông thường nên đơn giản đánh dấu riêng, mà ngăn cản chúng gọi hành động; Tuy nhiên, [NonAction] hữu ích lý bạn phải đánh dấu phương thức public Các yêu cầu cho URL phương pháp mục tiêu NonAction tạo 404-Not Found lỗi, thể hình 19-7 Hình 19-7 Tác động việc yêu cầu URL mà mục tiêu phương pháp NonAction TẠO MỘT SELECTOR TUỲ CHỈNH PHƯƠNG PHÁP HÀNH ĐỘNG Selectors phương pháp hành động bắt nguồn từ lớp ActionMethodSelectorAttribute, thể Listing 19-18 Listing 19-18 Các Lớp ActionMethodSelectorAttribute Các ActionMethodSelectorAttribute trừu tượng định nghĩa phương thức trừu tượng: IsValidForRequest Các tham số cho phương pháp đối tượng ControllerContext, mà cho phép bạn kiểm tra yêu cầu, đối tượng MethodInfo, mà bạn sử dụng để có thông tin phương pháp chọn bạnđã áp dụng Bạn quay trở lại từ IsValidForRequest phương pháp xử lý u cầu, khơng sai Tơi tạo phương pháp hành động tùy chọn đơn giản file class, LocalAttribute.cs, mà thêm vào Thư mục sở hạ tầng dự án ví dụ, Listing 19-19 Listing 19-19 Nội dung tập tin LocalAttribute.cs Tôi ghi đè phương pháp IsValidForRequest để trả true yêu cầu bắt nguồn từ máy địa phương Để chứng minh phương pháp hành động tùy chọn, tạo điều khiển Home dự án ví dụ, Listing 19-20 Listing 19-20 Nội dung tập tin HomeController.cs Tôi sử dụng thuộc tính ActionName để tạo tình có hai phương thức hoạt động Index Tại thời điểm ,các hoạt động invoker khơng có cách để tìm nên sử dụng yêu cầu truy cập đến URL / Home / Index tạo lỗi hình 19-8 có u cầu Hình 19-8 Các lỗi hiển thị có phương thức cập không rõ ràng Để giải tình này, tơi áp dụng phương thức tùy chỉnh lựa chọn thuộc tính cho phương thức không rõ ràng, Listing 19-21 Listing 19-21 Áp dụng phương thức lựa chọn thuộc tính tập tin HomeController.cs Nếu bạn khởi động lại ứng dụng điều hướng đến URL gốc từ trình duyệt chạy máy cục bộ, bạn thấy MVC Framework lấy phương pháp lựa chọn thuộc tính vào tài khoản để giải không xác định phương pháp lớp điều khiển, hình 19-9 Hình 19-9 Sử dụng phương pháp lựa chọn thuộc tính để giải phương thức hoạt động không rõ ràng PHƯƠNG THỨC HOẠT ĐỘNG QUI TRÌNH ĐỊNH HƯỚNG Bây bạn thấy bên phương pháp hoạt động chọn lớp bản, bạn hiểu invoker hoạt động để lựa chọn phương thức hoạt động The invoker bắt đầu trình với danh sách ứng cử viên có thể, phương pháp điều khiển đáp ứng tiêu chuẩn phương pháp hoạt động Sau trải qua tiến trình sau đây: - The invoker loại bỏ phương pháp dựa vào tên Chỉ có phương pháp có tên giống tiêu chí hoạt động có thuộc tính ActionName thích hợp lưu giữ danh sách - The invoker loại bỏ phương pháp có thuộc tính chọn phương pháp hành động trả false cho yêu cầu - Nếu có xác phương thức hành động với chọn bên trái, phương pháp sử dụng Nếu có nhiều phương pháp với lựa chọn, sau ngoại lệ đặt ra, invoker hành động khơng thể mập mờ phương pháp có sẵn - Nếu khơng có phương pháp hoạt động với chọn, sau invoker nhìn vào khơng có chọn Nếu có xác phương thức chẳng hạn , gọi invokerd Nếu có nhiều phương pháp mà khơng có chọn, ngoại lệ loại ra,vì invoker lựa chọn chúng GIẢI QUYẾT CÁC HOẠT ĐỘNG KHƠNG XÁC ĐỊNH Nếu invoker hoạt động khơng thể tìm thấy phương pháp hành động để gọi, trả failse từ phương pháp InvokeAction Khi xảy ra, lớp điều khiển gọi phương pháp HandleUnknownAction Theo mặc định, phương thức trả 404-Not Found cho khách hàng Đây điều hữu ích mà điều khiển làm cho hầu hết ứng dụng, bạn chọn ghi đè phương pháp lớp điều khiển bạn bạn muốn làm đặc biệt Listing 19-22 cung cấp trình diễn trọng phương pháp HandleUnknownAction điều khiển Home Listing 19-22 Phương pháp ghi đè HandleUnknownActon HomeController.cs file ... tạo số điều khiển Listing 19- 3 cho thấy Điều khiển sản phẩm Listing 19- 3: Nội dung tập tin Product Controller.cs Listing 19- 4 diễn tả Điều khiển khách hang Listing 19- 4: Nội dung tập tin CustomerController.cs... giản file class, LocalAttribute.cs, mà thêm vào Thư mục sở hạ tầng dự án ví dụ, Listing 19- 19 Listing 19- 19 Nội dung tập tin LocalAttribute.cs Tôi ghi đè phương pháp IsValidForRequest để trả true... HTTP POST, thể Listing 19- 16 Listing 19- 16 Sử dụng Attribute HttpPost Invoker hành động sử dụng phương pháp hành động để giải mơ hồ selectors lựa chọn hành động Trong Listing 19- 16, có hai ứng cử

Ngày đăng: 23/10/2019, 21:15

w