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

19.Chuong 19

33 3 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

Thông tin cơ bản

Định dạng
Số trang 33
Dung lượng 1,72 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

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 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 2

CHUẨ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 3

Quan đ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 4

Listing 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 5

chứ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 6

Cá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 7

Mộ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 9

Hai 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 10

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 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 11

mộ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 12

TÙ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 13

Thự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 14

chặ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 15

Giao 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 16

Khô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:

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

w