Các nhà máy sản xuất bộ điều khiển chịu trách nhiệm cho việc tạo ra các trường hợp của các bộ điều khiển để phục vụ một yêu cầu và các hành động Invoker là chịu trách nhiệm cho việc tìm
Trang 1CHƯƠ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 sẽ chỉ cho bạn một số tính năng tiên tiến MVC để làm việc với các bộ điều khiển Tôi bắt đầu chương này bằng cách khám phá các bộ phận của quá trình xử lý yêu cầu dẫn đến việc thực hiện một phương pháp hành động và thể hiện các cách khác nhau để kiểm soát
nó Hình 19-1 cho thấy dòng chảy cơ bản của kiểm soát giữa các thành phần
Hình 19-1 Gọi một phương thức hành động Phần đầu của chương này là các nhà máy sản xuất bộ điều khiển và các hành động Tên của các thành phần đề nghị mục đích của họ Các nhà máy sản xuất bộ điều khiển chịu trách nhiệm
cho việc tạo ra các trường hợp của các bộ điều khiển để phục vụ một yêu cầu và các hành động
Invoker là chịu trách nhiệm cho việc tìm kiếm và gọi phương thức hành động trong lớp điều
khiển Các MVC Framework có mặc định triển khai của cả hai thành phần, và tôi sẽ cho bạn thấy làm thế nào để cấu hình và kiểm soát hành vi của họ Tôi cũng sẽ cho thấy làm thế nào để thay
thế các thành phần hoàn toàn và sử dụng logic tùy chỉnh Bảng 19-1 cung cấp bản tóm tắt cho
chương này
Bảng 19-1 Chương Summary
Trang 2CHUẨN BỊ DỰ ÁN MẪU
Trong chương này , tôi tạo ra một dự án gọi là ControllerExtensibility bằng cách sử dụng tùy chọn template rỗng và kích hoạt các tùy chọn để thêm các tài liệu tham khảo lõi MVC và thư mục Tôi cần một số bộ điều khiển đơn giản để làm việc với trong chương này , để tôi có thể chứng minh các loại khác nhau của các tính năng mở rộng mà có sẵn Để có được thiết lập , tôi tạo ra các tập tin Result.cs trong Mô hình thư mục và sử dụng nó để xác định các lớp Kết quả được hiển thị trong Listing 19-1
Listing 19-1: Nội dung của tập tin Result.cs
Bước tiếp theo là tạo ra thư mục / Views /Shared và thêm một cái nhìn mới gọi là Result.cshtml
Đây là quan điểm rằng tất cả các phương thức hoạt động trong các bộ điều khiển sẽ làm , và bạn
có thể xem nội dung của tập tin này trong Listing 19-2
Listing 19-2: Nội dung của tập tin Result.cshtml
Trang 3Quan điểm này sử dụng lớp kết quả mà tôi định nghĩa trong Listing 19-2 như mô hình của nó và
hiển thị các giá trị của ControllerName và ActionName Cuối cùng , tôi cần phải tạo ra một số bộ
điều khiển cơ bản Listing 19-3 cho thấy Điều khiển sản phẩm
Listing 19-3: Nội dung của tập tin Product Controller.cs
Trang 4Listing 19-4 diễn tả Điều khiển khách hang
Listing 19-4: Nội dung của tập tin CustomerController.cs
Các bộ điều khiển không thực hiện bất kỳ hành động hữu ích khác hơn là để báo cáo rằng họ đã được gọi là 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 các URL gốc cho các ứng dụng hơn là đoán các URL dựa trên tập tin đang được chỉnh sửa.Chọn ControllerExtensibility Properties từ menu Project Studio Visual, chuyển sang Web và kiểm tra các tùy chọn trang cụ thể trong phần Bắt đầu hành động Bạn không cần phải cung cấp một giá trị Chỉ kiểm tra các tùy chọn là đủ Tạo một máy điều khiển tùy chỉnh Giống như phần nhiều các MVC Framework, cách tốt nhất để hiểu cách điều khiển các nhà máy làm việc là để tạo ra một tùy chỉnh triển khai Tôi không khuyên bạn làm điều này trong một dự án thực tế, như có những cách dễ dàng hơn để tạo ra hành vi tùy chỉnh bởi việc mở rộng các nhà máy được xây dựng trong Nhưng đây là một cách tốt đẹp để
Trang 5chứng minh làm thế nào các khuôn khổ MVC tạo ra các trường hợp của các bộ điều khiển Nhà máy điều khiển được xác định bởi giao diện IControllerFactory, được thể hiện trong Listing 19-5
Listing 19-5: Giao diện của IControllerFactory
Trong phần tiếp theo, tôi tạo ra một nhà máy điều khiển tùy chỉnh đơn giản và hướng dẫn
bạn thông qua việc triển khai cho mỗi phương pháp trong giao diện IControllerFactory Để bắt đầu , tôi tạo ra một thư mục cơ sở hạ tầng và thêm một file class mới gọi là
CustomControllerFactory.cs , mà tôi sử dụng để tạo ra các nhà máy điều khiển tùy chỉnh hiển thị
trong Bảng Listing 19-6
Listing 19-6: Nội dung của tập tin CustomControllerFactory.cs
Trang 6Các phương pháp quan trọng nhất trong giao diện là CreateController , mà MVC Framework gọi
khi nó cần một bộ điều khiển để phục vụ một yêu cầu Các tham số để phương pháp này là một
đối tượng RequestContext , cho phép các nhà máy để kiểm tra chi tiết các yêu cầu , và một chuỗi, trong đó có chứa các giá trị điều khiển từ URL chuyển các RequestContext lớp định nghĩa các
thuộc tính mô tả trong Bảng 19-2
Bảng 19-2: Các thuộc tính RequestContext
Trang 7Một trong những lý do mà tôi không khuyên bạn nên tạo một điều khiển tùy chỉnh theo cách này là việc tìm kiếm các lớp điều khiển trong web ứng dụng và instantiating họ là phức tạp Bạn cần để có thể xác định vị trí các bộ điều khiển tự động và liên tục và đối phó với tất cả các loại của các vấn đề tiềm năng, chẳng hạn như disambiguating giữa các lớp có cùng tên trong không gian tên khác nhau,trường hợp ngoại lệ nhà xây dựng và nhiều hơn cả
Chỉ có hai bộ điều khiển trong dự án ví dụ và tôi sẽ nhanh chóng chúng trực tiếp, có nghĩa
là khó đi dây các tên lớp thành nhà máy sản xuất bộ điều khiển, một cái gì đó rõ ràng là không phải là một ý tưởng tốt cho một dự án thực sự, nhưng cho phép tôi để bên ngoài số tiền rất lớn của sự phức tạp
Mục đích của phương pháp CreateController là tạo ra các thể hiện của lớp điều khiển có thể xử lý hiện tại yêu cầu Không có giới hạn về cách bạn làm điều này Các quy tắc duy nhất là bạn phải trả lại một đối tượng có hiện thực Giao diện IController như là kết quả của phương thức
Các quy ước mà bạn đã thấy cho đến nay trong cuốn sách này tồn tại bởi vì đó là cách các nhà máy điều khiển mặc định đã được viết.Như một ví dụ, tôi đã thực hiện một trong các công ước này trong mã của tôi: đó là khi tôi nhận được một yêu cầu cho một bộ điều khiển, tôi nối thêm Điều khiển để tên lớp, do đó yêu cầu cho sản phẩm dẫn đến các ProductController lớp phúc khởi tạo
Bạn được tự do làm theo các công ước MVC Framework khi bạn viết một máy điều khiển hoặc để loại bỏ chúng và tạo ra riêng của bạn cho phù hợp với nhu cầu của dự án của bạn Tôi không nghĩ rằng nó là hợp lý để tạo ra các công ước của riêng bạn chỉ vì lợi ích của nó, nhưng nó
là hữu ích để hiểu như thế nào linh hoạt các MVC Framework có thể được
ĐỐI PHÓ VỚI CÁC ĐIỀU KHIỂN DỰ PHÒNG
Nhà máy tùy chỉnh bộ điều khiển phải trả lại một thực hiện các giao diện IController như
là kết quả từ Phương pháp CreateController, nếu không, một lỗi sẽ được hiển thị cho người dùng Điều này có nghĩa rằng bạn cần phải có một dự phòng vị trí cho khi yêu cầu bạn chế biến không nhằm vào bất kỳ của các bộ điều khiển trong dự án của bạn Bạn có thể tạo ra bất kỳ chính sách bạn muốn để đối phó với tình trạng này: bạn có thể định nghĩa một bộ điều khiển đặc biệt mà ám một thông báo lỗi, ví dụ, hoặc làm như tôi có và bản đồ theo yêu cầu để một lớp điều khiển được biết là luôn luôn tồn tại
Khi tôi nhận được một yêu cầu mà không có bản đồ cho một trong các bộ điều khiển trong
dự án, tôi nhắm mục tiêu các ProductController Điều này có thể không phải là điều hữu ích nhất
để làm trong một dự án thực sự, nhưng nó chứng minh rằng các nhà máy có điều khiển hoàn chỉnh linh hoạt trong cách yêu cầu được giải thích Tuy nhiên, bạn cần phải biết làm thế nào các điểm khác trong khung MVC vận hành
Theo mặc định, các MVC Framework chọn một quan điểm dựa trên các giá trị điều khiển trong các dữ liệu định tuyến, không phải là tên của lớp điều khiển Vì vậy, trong ví dụ của tôi, nếu tôi muốn các vị trí dự phòng để làm việc với điểm đó theo quy ước của việc theo tên điều khiển tổ chức, tôi cần phải thay đổi giá trị của bộ điều khiển định tuyến tính, như thế này:
requestContext.RouteData.Values ["controller"] = "Product";
Trang 8
Sự thay đổi này sẽ gây ra các MVC Framework để tìm kiếm các quan điểm kết hợp với bộ điều khiển dự phòng và không điều khiển rằng hệ thống định tuyến đã được xác định dựa trên các URL mà người dùng yêu cầu
Có hai điểm quan trọng ở đây: thứ nhất là không chỉ các nhà máy điều khiển có trách nhiệm duy nhất cho phù hợp yêu cầu để điều khiển, nhưng nó có thể thay đổi theo yêu cầu để thay đổi hành vi của các bước tiếp theo trong các đường ống xử lý yêu cầu.Đây là công cụ khá mạnh và một đặc tính quan trọng của MVC Framework Điểm thứ hai là trong khi bạn có thể tự
do làm theo bất cứ điều gì bạn muốn ước trong nhà máy điều khiển của bạn, bạn vẫn cần phải biết những gì các công ước là cho các bộ phận khác của MVC Framework Và, bởi vì những thành phần khác có thể được thay thế với mã tùy chỉnh là tốt (như tôi đã chứng minh cho quan điểm trong Chương 20), nó có ý nghĩa để làm theo như nhiều người trong số các công ước như
có thể cho phép các thành phần được phát triển và sử dụng độc lập với nhau
LỚP ĐIỀU KHIỂN TỨC THÌ
Không có quy định về cách bạn tạo các lớp điều khiển của bạn, nhưng nó là thực hành tốt
để sử dụng giải quyết phụ thuộc mà tôi giới thiệu trong chương 6 Điều này cho phép bạn để giữ cho máy điều khiển tùy chỉnh của bạn tập trung vào các yêu cầu lập bản đồ để điều khiển lớp học, và để lại những vấn đề như sự phụ thuộc tiêm để được xử lý riêng và cho toàn bộ ứng dụng Bạn có thể xem như thế nào tôi sử dụng lớp DependencyResolver để tạo ra bộ đ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ả về một thực hiện các Giao diện
IDependencyResolver, trong đó xác định phương pháp GetService Bạn vượt qua một đối tượng System.Type để phương pháp này và có được một thể hiện của nó trong trở lại Có một phiên bản mạnh mẽ đánh máy của phương pháp GetService, nhưng bởi vì tôi làm không biết loại tôi đang đối phó với trước, tôi đã sử dụng các phiên bản trả về một đối tượng và sau đó thực hiện một rõ ràng trường hợp để IController
Chú ý: Chú ý rằng tôi không sử dụng các trình giải quyết phụ thuộc để giải quyết vấn đề chặt khớp nối giữa các lớp Thay vào đó, tôi yêu cầu nó để tạo ra các thể loại mà tôi chỉ định để
nó có thể kiểm tra sự phụ thuộc của các lớp điều khiển đã tuyên bố và giải quyết chúng Tôi đã không được thiết lập Ninject trong chương này, điều đó có nghĩa là resolver mặc định sẽ được sử dụng và đó chỉ đơn giản là tạo ra các trường hợp bằng cách tìm các nhà xây dựng không tham số
và gọi cho họ Tuy nhiên, bằng cách xây dựng nhà máy sản xuất bộ điều khiển của tôi để sử dụng lớp DependencyResolver, tôi đảm bảo rằng tôi có thể liên tục tận dụng nhiều phân giải phụ thuộc cao cấp như Ninject nếu được thêm vào dự án
TRIỂN KHAI THỰC HIỆN CÁC PHƯƠNG PHÁP GIAO DIỆN
KHÁC
Trang 9Hai phương pháp khác là trong giao diện IControllerFactory:
Phương pháp GetControllerSessionBehavior được sử dụng bởi các MVC Framework để xác định xem phiên dữ liệu nên được duy trì trong một bộ điều khiển Tôi sẽ trở lại vấn
đề này "Sử dụng Sessionless Controllers" sau này trong chương này
Phương pháp ReleaseController được gọi khi một đối tượng điều khiển được tạo ra bởi các CreateController không còn cần thiết Trong thực hiện ví dụ của tôi, tôi kiểm tra để xem nếu các lớp thực hiện các giao diện IDisposable Nếu có, tôi gọi phương thức
Dispose để giải phóng bất kỳ tài nguyên có thể được giải phóng
Triển khai thực hiện của tôi về phương pháp GetControllerSessionBehavior và ReleaseController
là phù hợp cho hầu hết các dự án và có thể được sử dụng đúng nguyên văn (mặc dù bạn nên đọc phần trên bộ điều khiển sessionless sau này để chắc chắn rằng bạn hiểu các 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 rằng các MVC Framework có thể sử dụng các máy điều khiển tùy chỉnh thông qua các lớp ControllerBuilder Bạn cần phải đăng ký bộ điều khiển nhà máy tùy chỉnh khi ứng dụng được bắt đầu, có nghĩa là sử dụng phương pháp Application_Start trong file Global.asax.cs, như thể hiện trong Listing 19-7
Listing 19-7 Đăng ký một máy điều khiển tùy chỉnh trong tập tin Global.asax
Khi các nhà máy điều khiển đã được đăng ký, nó sẽ chịu trách nhiệm xử lý tất cả các yêu cầu mà các ứng dụng nhận được Bạn có thể xem hiệu quả của các nhà máy tùy chỉnh bằng cách khởi động ứng dụng Các trình duyệt sẽ yêu cầu các URL gốc, sẽ được ánh xạ tới bộ điều khiển Trang chủ của hệ thống định tuyến Các nhà máy tùy chỉnh sẽ xử lý yêu cầu cho các chủ
điều khiển bằng cách tạo ra một thể hiện của lớp ProductController , mà sẽ sản xuất các kết quả thể hiện trong hình 19-2
Trang 10Hì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 sẽ chỉ cho bạn làm thế nào để tạo ra một máy điều khiển tùy chỉnh vì nó là cách hiệu quả nhất để chứng minh những gì một bộ điều khiển nhà máy nào và làm thế nào nó hoạt động Đối với hầu hết các ứng dụng, tuy nhiên, các lớp nhà máy điều khiển tích hợp, gọi là
DefaultControllerFactory, là hoàn toàn phù hợp Khi nhận được một yêu cầu từ hệ thống định
tuyến, nhà máy này nhìn vào các dữ liệu định tuyến để tìm giá trị của tài sản bộ điều khiển và cố gắng tìm một lớp học trong các ứng dụng Web đáp ứng các tiêu chí sau đây:
Các lớp phải được công khai
Các lớp phải cụ thể (không trừu tượng)
Các lớp không phải mất các thông số chung chung
Tên của lớp phải kết thúc với Controller
Các lớp phải thực hiện các giao diện IController
Lớp DefaultControllerFactory duy trì một danh sách các lớp học như vậy trong các ứng
dụng, do đó nó không cần phải thực hiện tìm kiếm mỗi khi một yêu cầu đến Nếu một lớp học phù hợp được tìm thấy, sau đó một thể hiện được tạo ra bằng cách sử dụng bộ điều khiển kích hoạt (Tôi sẽ trở lại vấn đề này trong phần tới "Tùy chỉnh điều khiển DefaultControllerFactory"),
và công việc của điều khiển hoàn tất Nếu không có điều khiển phù hợp, sau đó yêu cầu có thể không được xử lý thêm nữa
Chú ý các lớp DefaultControllerFactory sau mô hình convention-over-configuration
Bạn không cần phải đăng ký điều khiển của bạn trong một tập tin cấu hình, bởi vì các nhà máy sẽ tìm thấy chúng cho bạn Tất cả bạn cần làm là tạo ra các lớp đáp ứng các tiêu chí mà các nhà máy đang tìm kiếm Nếu bạn muốn tạo ra hành vi điều khiển nhà máy tùy chỉnh, bạn có thể cấu hình các thiết lập mặc định của nhà máy hoặc ghi đè lên một số phương pháp Bằng cách này,
bạn có thể xây dựng trên những hành vi hữu ích convention-over-configuration mà không cần
phải tái tạo nó, một nhiệm vụ mà, tôi đã nói trước đó, là phức tạp và đau đớn Trong phần tiếp theo, tôi chỉ cho bạn những cách khác nhau để điều chỉnh tạo điều khiển
ƯU TIÊN NAMESPACES
Trong Chương 16, tôi chỉ cho bạn làm thế nào để ưu tiên một hoặc nhiều không gian tên khi tạo một tuyến đường Điều này đã được giải quyết nhập nhằng Vấn đề điều khiển, nơi mà các lớp điều khiển có cùng tên nhưng cư trú trong không gian tên khác nhau Nó là
DefaultControllerFactory xử lý các danh sách các không gian tên và ưu tiên cho họ Mẹo ưu tiên
toàn cầu được ghi đè bởi tuyến đường cụ thể ưu tiên Điều này có nghĩa là bạn có thể xác định
Trang 11một chính sách toàn cầu, và sau đó có thể là tuyến cá nhân theo yêu cầu Xem Chương 16 để biết
chi tiết về cách xác định không gian tên cho các tuyến cá nhân Nếu bạn có một ứng dụng có rất nhiều tuyến đường, nó có thể được thuận tiện hơn để xác định không gian tên ưu tiên toàn cầu,
do đó chúng được áp dụng cho tất cả các tuyến đường của bạn Listing 19-8 cho thấy làm thế nào
để làm điều này trong các phương pháp Application_Start của Tập tin Global.asax (Đây là nơi
mà tôi đặt các báo cáo, nhưng bạn cũng có thể sử dụng các tập tin RouteConfig.cs trong
Thư mục App_Start nếu bạn thích.)
Listing 19-8 Ưu tiên Namespace toàn cầu trong tập tin Global.asax
Tôi sử dụng phương pháp ControllerBuilder.Current.DefaultNamespaces.Add tĩnh để thêm không gian tên mà nên được ưu tiên Thứ tự mà tôi thêm các không gian tên nào không bao hàm bất kỳ loại để tìm kiếm hoặc ưu tiên tương đối.Tất cả các không gian tên được xác định theo phương pháp Add được đối xử bình đẳng và các ưu tiên là liên quan đến những không gian tên không được chỉ định bởi các phương pháp Add Điều này có nghĩa rằng các nhà máy điều khiển
sẽ tìm kiếm toàn bộ ứng dụng nếu nó không thể tìm thấy một lớp điều khiển thích hợp trong các không gian tên được xác định theo phương pháp Add
Mẹo: Thông báo mà tôi đã sử dụng một ký tự dấu hoa thị (*) trong câu lệnh thứ hai được in đậm trong ví dụ 19-8. Điều này cho phép tôi để xác định rằng các nhà máy điều khiển
nên nhìn trong không gian tên MyProject và bất kỳ không gian tên con rằng chứa MyProject
Mặc dù điều này có vẻ như cú pháp biểu hiện thường xuyên, nó không phải là; bạn có thể kết bạn với không gian tên *, nhưng bạn không thể sử dụng cú pháp bất kỳ biểu hiện thường xuyên khác với các phương pháp Add
Trang 12TÙY CHỈNH ĐIỀU KHIỂN DEFAULTCONTROLLERFACTORY
Có một số cách để tùy chỉnh như thế nào lớp DefaultControllerFactory khởi tạo đối
tượng điều khiển Bởi đến nay, lý do phổ biến nhất cho việc tùy chỉnh các nhà máy điều khiển là
để hỗ trợ thêm cho DI Có nhiều cách khác nhau để làm điều này Các kỹ thuật thích hợp nhất tùy thuộc vào cách bạn đang sử dụng DI nơi khác trong ứng dụng của bạn
riêng của nhà máy điều khiển tùy chỉnh của tôi Các DefaultControllerFactory sẽ gọi phương
thức IDependencyResolver.GetService để yêu cầu một Ví dụ điều khiển, mang đến cho bạn cơ
hội để giải quyết và tiêm bất kỳ phụ thuộc
SỬ DỤNG MỘT ĐIỀU KHIỂN ĐỘNG
Bạn cũng có thể giới thiệu DI vào bộ điều khiển bằng cách tạo ra một chất kích hoạt bộ điều khiển Bạn tạo activator này bằng cách thực hiện các Giao diện IControllerActivator, như thể hiện trong Listing 19-9
Bảng Listing 19-9 Giao diện IControllerActivator
Giao diện có chứa một phương pháp, gọi là Tạo, mà là thông qua một đối tượng RequestContext
mô tả yêu cầu và một loại chỉ định mà lớp điều khiển nên được khởi tạo.Để chứng minh một
thực hiện của giao diện này, tôi đã thêm một tập tin lớp mới gọi là CustomControllerActivator.cs
trong thư mục cơ sở hạ tầng và sử dụng nó để xác định các lớp thể hiện trong Listing 19-10
Listing 19-10 Nội dung của tập tin CustomControllerActivator.cs
Trang 13Thực hiện IControllerActivator là đơn giản Nếu lớp ProductController được yêu cầu, nó
phản ứng với một thể hiện của lớp CustomerController Đây không phải là một cái gì đó bạn sẽ
muốn làm trong một dự án thực, nhưng nó thể hiện như thế nào bạn có thể sử dụng giao diện
IControllerActivator để đánh chặn các yêu cầu giữa máy điều khiển và giải quyết phụ thuộc
Để sử dụng một chất kích hoạt tùy chỉnh, tôi cần phải vượt qua một thể hiện của lớp thực hiện
vào Constructor DefaultControllerFactory và đăng ký kết quả trong phương pháp
Application_Start của Tập tin Global.asax, như thể hiện trong Listing 19-11
Listing 19-11 Đăng ký một Activator Tuỳ chỉnh trong File Global.asax
Bạn có thể xem hiệu quả của các hoạt tùy chỉnh nếu bạn khởi động ứng dụng và điều hướng đến
các URL / Product Các tuyến đường sẽ nhắm mục tiêu điều khiển sản phẩm,
DefaultControllerFactory sẽ yêu cầu kích hoạt để nhanh chóng Lớp ProductFactory, nhưng
Trang 14chặn activator của tôi yêu cầu này và tạo ra một thể hiện của Lớp CustomerController thay vào
đó, như thể hiện trong hình 19-3
Hình 19-3 Chặn yêu cầu sử dụng một bộ điều khiển tùy chỉnh động
PHƯƠNG PHÁP DEFAULTCONTROLLERFACTORY
Bạn có thể ghi đè lên phương thức trong lớp DefaultControllerFactory để tùy chỉnh việc tạo ra
các bộ điều khiển Bảng 19-3 mô tả ba phương pháp bạn có thể ghi đè lên, mỗi trong số đó thực hiện một vai trò khác nhau
Bảng 19-3 Phương pháp DefaultContollerFactory Overridable
TẠO CUSTOM ACTION INVOKER
Khi các nhà máy điều khiển đã tạo ra một thể hiện của một lớp, khuôn khổ cần một cách để gọi một hành động về trường hợp đó.Nếu bạn bắt nguồn điều khiển của bạn từ các lớp điều khiển, thì
đây là trách nhiệm của một invoker hành động, đó làchủ đề của phần này
Mẹo Nếu bạn tạo một bộ điều khiển trực tiếp từ giao diện IController, sau đó bạn có trách nhiệm
thực hiện các hành động chính mình (Xem chi tiết việc tạo các bộ điều khiển theo cách này.)
Invokers hành động này là một phần của các chức năng bao gồm trong Lớp điều khiển.Invoker hành động thực hiện giao diện IActionInvoker, được thể hiện trong Listing 19-12
Listing 19-12 Giao diện IActionInvoker
Trang 15Giao diện này chỉ có một thành viên duy nhất: InvokeAction Các thông số là một đối tượng
ControllerContext (mà tôi mô tả trong Chương 17) và một chuỗi chứa tên của các hành động
được gọi Các kiểu kết quả là một bool: giá trị của sự thật cho thấy rằng các hành động đã được tìm thấy và được gọi và sai chỉ ra rằng bộ điều khiển không có hành động phù hợp
Chú ý rằng tôi đã không sử dụng phương pháp từ trong mô tả này Sự kết hợp giữa hành động và phương pháp là không bắt buộc Mặc dù đây là cách tiếp cận đó được xây dựng trong invoker hành động mất, bạn được tự do để xử lý các hành động bất kỳ cách nào mà bạn chọn Listing 19-
13 cho thấy một thực hiện các giao diện IActionInvoker mà phải mất một cách tiếp cận khác nhau, mà tôi được định nghĩa trong một file class gọi là CustomActionInvoker.cs trong thư mục
cơ sở hạ tầng
Listing 19-13 Nội dung của tập tin CustomActionInvoker.cs
Invoker hành động này không quan tâm đến các phương pháp trong các lớp điều khiển Trong thực tế, nó đề với các hành động của chính nó Nếu yêu cầu hành động Index, sau đó các invoker viết một thông báo trực tiếp đến Response Nếu yêu cầu có hành động nào khác, sau đó nó sẽ trả
về false, gây ra một lỗi 404-Not Found sẽ được hiển thị cho người dùng Invoker hành động kết hợp với một bộ điều khiển thu được thông qua thuộc tính Controller.ActionInvoker Cái này có nghĩa là các bộ điều khiển khác nhau trong cùng một ứng dụng có thể sử dụng invokers hành
động khác nhau Để chứng minh điều này, tôi đã thêm một điều khiển để các dự án ví dụ được
gọi ActionInvoker, định nghĩa của bạn có thể thấy trong Listing 19-14
Listing 19-14 Nội dung của File ActionInvokerController.cs
Trang 16Không có phương pháp hành động trong bộ điều khiển này Nó phụ thuộc vào invoker hành động
để xử lý yêu cầu Bạn có thể xem cách này bằng cách bắt đầu ứng dụng và điều hướng đến các
URL / ActionInvoker / Index Invoker hành động tùy chỉnh sẽ tạo ra các phản ứng thể hiện trong
hình 19-4 Nếu bạn điều hướng đến một URL mà mục tiêu bất kỳ hành động khác trên cùng bộ
điều khiển, bạn sẽ xem các trang 404-Error
Hình 19-4 Tác động của invoker hành động tùy chỉnh Tôi không gợi ý rằng bạn thực hiện invoker hành động của riêng bạn Và, nếu bạn làm thế, tôi không đề nghị bạn làm theo cách này Tại sao? Thứ nhất, hỗ trợ xây dựng trong có một số tính năng hữu ích, như bạn sẽ thấy ngay Thứ hai, ví dụ có một số vấn đề: thiếu khả năng mở rộng, tách nghèo trách nhiệm và thiếu sự hỗ trợ cho quan điểm của bất cứ loại nào Nhưng ví dụ cho thấy làm thế nào MVC Framework phù hợp với nhau và chứng minh, một lần nữa, mà hầu như mọi khía cạnh của đường ống xử lý yêu cầu có thể được tùy chỉnh hoặc thay thế hoàn toàn
SỬ DỤNG CÁC HÀNH ĐỘNG INVOKER BUILT-IN
Việc xây dựng trong invoker hành động, đó là lớp ControllerActionInvoker, có một số kỹ thuật
tinh vi cho phù hợp với các yêu cầu để hành động Và, không giống như thực hiện của tôi trong
các phần trước, invoker hành động mặc định hoạt động trên phương pháp Để hội đủ điều kiện
như là một hành động, một phương pháp phải đáp ứng các tiêu chí sau: