2011-08-16 8 views
7

Tôi quan tâm đến khái niệm đánh chặn trong thời gian gần đây. Tôi biết rằng khái niệm này được sử dụng trong nhiều thư viện như NHibernate, Entity Framework và các thư viện khác. Nhưng tôi quan tâm đến cách sử dụng khái niệm này trong ứng dụng web ASP.NET MVC.Vị trí và cách sử dụng các trình chặn trong ứng dụng web?

Trường hợp sử dụng nó trong ứng dụng web Mvc hữu ích ở đâu?

Có dự án Asp.Net Mvc nguồn mở nào sử dụng bộ chặn không?

Asp.net Mvc đã hỗ trợ một loại trình chặn cho bộ điều khiển có bộ lọc. Tốt hơn là sử dụng các bộ lọc thay vì chặn?

+1

Tôi sẽ nói bạn hãy xem Dependency Injection vì đây là thuật ngữ thường được sử dụng hơn cho loại chức năng bạn đang tìm kiếm. – thekip

+0

@thekip - Tôi biết điều đó. Vì vậy, tôi đã thêm thẻ ioc cho nó. – AnyOne

+0

Có vẻ như bạn đang tìm kiếm [AOP on .NET] (http://www.sharpcrafters.com/aop.net). –

Trả lời

0

Tôi muốn nói rằng bạn sử dụng hộp chứa DI chung hơn để tiêm phụ thuộc của bạn. Điều này không chỉ phụ thuộc vào bộ điều khiển của bạn, nó còn phục vụ các phụ thuộc của những phụ thuộc đó, do đó dẫn đến một đồ thị đối tượng hoàn chỉnh của tất cả các đối tượng phụ thuộc của bạn.

Sử dụng vùng chứa DI cho giao diện người dùng cũng mang đến các cơ hội tốt để làm cho mặt sau của bạn có nhiều đơn vị có thể kiểm tra và kết hợp lỏng lẻo hơn.

+0

Heyy bạn chưa nói gì về máy bay đánh chặn ... – AnyOne

+0

Tôi không biết về bất kỳ chức năng nào mà một thiết bị chặn không thể cung cấp như trái ngược với hộp chứa DI? – thekip

+0

Tôi đã không có ý định sử dụng tinh khiết của interceptors mà không có DI container trong câu hỏi của tôi. Nó chỉ được ngụ ý hoàn toàn – AnyOne

5

chặn có thể được sử dụng cho nhiều điều - đáng chú ý nhất để giải quyết mối quan tâm xuyên suốt như thiết bị đo đạc, khai thác gỗ, kiểm toán, an ninh, đo vv

Bạn don't need a DI Container to apply the concept, nhưng nó giúp.

Bạn có thể sử dụng bộ lọc ASP.NET MVC để đạt được hiệu quả tương tự, nhưng tại sao lại hạn chế bản thân với khung MVC khi bạn có thể áp dụng một triển khai có thể tái sử dụng chung?

12

Vị trí/thời điểm sử dụng máy đánh chặn

Hãy xem ứng dụng trước mà bạn đã phát triển và kiểm tra mã. Tìm kiếm mã thường được sao chép ở đầu hoặc cuối phương thức và thuộc tính. Đây là mã mà bạn có thể xem xét chuyển từ tất cả các phương thức đó thành một kẻ đánh chặn. Ví dụ, tôi đã nhận thấy rằng nhiều hành động MVC của tôi mà thực hiện xác nhận đầu vào làm như vậy với cùng một dòng cặp đôi cùng một đoạn mã:

if (!ModelState.IsValid) 
    return View(model); 

Đây là mã có tiềm năng có thể được chuyển đến một đánh chặn (có thể là một bộ lọc MVC trong trường hợp này). Chi phí viết và áp dụng bộ lọc có lớn hơn chi phí của mã trùng lặp này không? (2 dòng mã lần số hành động điều khiển bằng cách sử dụng này). Trong trường hợp này, có lẽ không. Tuy nhiên, có những tình huống khác, khi lợi ích của việc sử dụng máy đánh chặn sẽ lớn hơn.

Dưới đây là danh sách một số tình huống mà tôi tưởng tượng kiểu này trùng lắp mã có thể xảy ra, ví dụ kịch bản mà mùi như họ có thể được hưởng lợi từ tuyến cống bao:

  • Input xác nhận (như minh họa ở trên).
  • Ghi nhật ký gỡ lỗi. Bạn có thể write an interceptor ghi lại lối vào và lối ra của mọi cuộc gọi phương thức.
  • Đồng bộ hóa chủ đề. Câu hỏi của bạn là về ứng dụng web, nhưng nếu bạn đang phát triển ứng dụng Windows với chế độ xem kiểu MVP, bạn có thể áp dụng trình chặn chặn để đảm bảo rằng tất cả các cuộc gọi phương thức đều được đồng bộ hóa trở lại luồng giao diện người dùng.
  • Giao dịch cơ sở dữ liệu. Hầu hết các mã giao dịch cơ sở dữ liệu của tôi trông như thế này:

 

using (var transaction = Session.BeginTransaction()) 
{ 
    // ... do some work that is unique to this method ... 
    transaction.Commit(); 
} 
  • PropertyChanged triển khai sự kiện. Mã này thường rất lặp đi lặp lại và gây phiền nhiễu để viết. Sacha Barber has thoroughly explored how to automatically implement this event using various frameworks.
  • Bảo mật. Có thể có nhiều phương pháp trong ứng dụng của bạn nên được giới hạn chỉ cho một số người dùng nhất định. The AuthorizeAttribute là bộ lọc cho chính xác điều này.
  • Điều chỉnh yêu cầu dịch vụ web. Một số API, chẳng hạn như API cho Basecamp, yêu cầu bạn limit your requests đến một số yêu cầu nhất định trên một khung thời gian nhất định. Nếu bạn đã viết một lớp máy khách Basecamp, bạn có thể áp dụng một máy đánh chặn cho nó để đảm bảo rằng tất cả các phương thức gọi đều được tôn trọng giới hạn tốc độ, sử dụng Thread.Sleep khi cần thiết.
  • Kết quả bộ nhớ đệm.MVC has some filters pre-built for this purpose. Bạn có thể viết trình chặn đánh chặn của riêng bạn để lưu trữ kết quả cho các lớp bên dưới lớp giao diện người dùng.
  • Xử lý lỗi WCF. Bạn không thể Dispose một máy khách WCF nếu nó ở trạng thái Faulted, vì vậy mọi phương thức tạo và phá hủy một cá thể của ứng dụng khách cần kiểm tra trạng thái, sau đó gọi Abort nếu cần thiết thay vì chỉ cần đóng mệnh đề using xung quanh máy khách. Một kẻ đánh chặn có thể không phù hợp nhất trong trường hợp này. Nó có thể dễ dàng hơn to just fix the Dispose implementation or use some kind of wrapper.

Có hay không ví dụ trên sẽ là ứng cử viên tốt cho người đánh chặn phụ thuộc vào sự phức tạp độc đáo của đơn đăng ký của bạn. Danh sách này tất nhiên là không đầy đủ, cũng không thể. Các ứng dụng có thể có của các interceptor khác nhau như các ứng dụng bạn viết.

Làm thế nào để sử dụng máy bay đánh chặn

tôi có thể nghĩ đến ba nơi chính nơi bạn có thể muốn áp dụng một đánh chặn: Bộ xử lý, dịch vụ, và các đối tượng miền.

  • Với một bộ điều khiển MVC, nó làm cho ý nghĩa nhất để đi về phía trước và sử dụng MVC's filters.
  • Đối với một dịch vụ trung cấp mà bạn sẽ rút khỏi container IoC của bạn, bộ lọc không phải là một lựa chọn (vì nó không phải là một bộ điều khiển), vì vậy bạn nên sử dụng interception features of your IoC container.
  • Đối với các đối tượng miền mà bạn thường khởi tạo trực tiếp với một hàm tạo (nếu là thực thể mới) hoặc tìm nạp từ ORM của bạn (nếu là thực thể hiện tại), bạn sẽ cần sử dụng một số loại đối tượng nhà máy thay vì hàm tạo và instruct your ORM how to use the factory.

Thông tin chi tiết về cách thực hiện tất cả điều này sẽ tùy thuộc vào công cụ bạn đang sử dụng.