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.
Nguồn
2011-08-17 16:54:02
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
@thekip - Tôi biết điều đó. Vì vậy, tôi đã thêm thẻ ioc cho nó. – AnyOne
Có vẻ như bạn đang tìm kiếm [AOP on .NET] (http://www.sharpcrafters.com/aop.net). –