2013-02-21 37 views
8
  1. ASP.NET MVC đề xuất sử dụng hoặc mở rộng bộ lọc Cấp phép, Hành động, Kết quả, Ngoại lệ tích hợp.
  2. Bên thứ 3. Hộp chứa IPC (Unity, Ninject, Autofac) đề xuất Thiết bị chặn
  3. Công cụ AOP của bên thứ 3 (Postsharp) đề xuất thuộc tính của chúng.

Bây giờ, tôi đã sai lầm. Tôi có thể trộn tất cả chúng không. Tôi muốn xây dựng mã mạnh mẽ và phương pháp ổn định, tôi nên sử dụng những gì?AOP vs Bộ lọc MVC Thuộc tính và Bộ chặn

Trả lời

6

Tất cả bắt đầu với thiết kế ứng dụng tốt. Khi thiết kế ứng dụng của bạn là chính xác, sẽ có rất ít lý do để bạn tương tác với những AOP như các tính năng mà khung UI của bạn hiển thị (điều này cũng giữ cho WCF).

Khi bạn ẩn tất cả logic nghiệp vụ phía sau giao diện chung, và truyền thông báo lệnh tới nó (như được hiển thị trong this article), Bộ điều khiển của bạn sẽ trở thành trình bao bọc mỏng thường không nhiều hơn thực thi lệnh kinh doanh đó. Trong trường hợp đó, bạn sẽ có thể thực hiện ủy quyền và lọc ngoại lệ bằng cách gói các hoạt động kinh doanh đó, để lại mã UI sạch sẽ và không có các thuộc tính. Bao gồm những mối quan tâm xuyên suốt xung quanh các hoạt động kinh doanh có thể được thực hiện với cả việc đánh chặn hoặc plain old decorators. Điều này cho phép bạn linh hoạt hơn nhiều và giữ thiết kế của bạn SOLID (có nhiều lợi ích lâu dài rõ ràng hơn).

Mặc dù công cụ dệt mã như PostSharp có sử dụng, bạn nên cẩn thận với chúng. Chúng tiêm mã vào assembly của bạn bằng cách sử dụng một quá trình biên dịch. Điều này làm cho nó rất đau đớn để đơn vị kiểm tra những lớp học mà không cần nhấn những khía cạnh. Bạn không thể dễ dàng kiểm tra các lớp đó trong sự cô lập (đó là điều kiện tiên quyết để kiểm tra đơn vị). Làm cho các khía cạnh của bạn phụ thuộc vào một số biến tĩnh, phức tạp cả hai khía cạnh và các bài kiểm tra đơn vị. Biến tĩnh làm cho nó khó khăn để chạy thử nghiệm đơn vị song song và việc sử dụng các hằng số toàn cục sẽ yêu cầu kiểm tra để phá vỡ cài đặt toàn cầu đã thay đổi một cách chính xác để ngăn các thử nghiệm khác bị ảnh hưởng.

Mặc dù công cụ dệt mã dẫn đến hiệu suất thường lớn hơn chặn, không đạt được hiệu suất so với việc sử dụng trang trí.

+0

Làm thế nào để tiêm thời gian biên dịch can thiệp vào thử nghiệm đơn vị? Bạn thậm chí sẽ không kiểm tra đơn vị mà không biên dịch bạn biết? – jfar

+0

@jfar: Mã sản xuất của bạn được dệt cùng với các khía cạnh trong quá trình biên dịch. Bởi vì điều này bạn không thể kiểm tra mã sản xuất của bạn nữa trong sự cô lập. Khi kiểm tra đơn vị gọi một số mã sản xuất, các khía cạnh sẽ luôn được áp dụng. Trong thực tế, bạn không thể kiểm tra đơn vị, vì theo định nghĩa, một thử nghiệm đơn vị chạy trong sự cô lập. Những gì bạn sẽ có là một bài kiểm tra tích hợp. Bạn muốn hoàn tác yêu cầu của mình ngay bây giờ? – Steven

+0

Mã của bạn luôn được kết hợp với nhau bởi trình biên dịch, sản xuất và kiểm tra đơn vị có thể có thể nhận được các phiên bản khác nhau của trình biên dịch để có thể có bất kỳ mã nào với trang trí hoặc DI hoặc bất kỳ thứ gì. Lỗ hổng trong câu trả lời này là AOP hoặc PostSharp không ảnh hưởng đến thử nghiệm đơn vị theo bất kỳ cách nào độc đáo hoặc đáng chú ý. – jfar

4

Bạn đã trích dẫn ba công nghệ mà tất cả đều có ý định làm tương tự: thêm chức năng vào một codebase hiện tại mà không sửa đổi nó.

ASP.NET MVC và DI cả hai đặt giới hạn trên trong đó bạn có thể có các khía cạnh (bộ lọc hoặc bộ chặn) vì công nghệ chỉ có thể thêm hành vi tại một số địa điểm. Chỉ các công nghệ dựa trên trình biên dịch như PostSharp mới có khả năng thêm các khía cạnh ở khắp mọi nơi. Tuy nhiên, cả ba là triển khai các khái niệm AOP.

Các khía cạnh đã chứng minh lợi ích so với lập trình hướng đối tượng thông thường trong nhiều trường hợp sử dụng. Nó không phải là sự thật rằng mọi vấn đề duy nhất có thể được giải quyết bằng OOP thông thường với thiết kế tốt hơn với cùng một chi phí. Tuy nhiên, chính xác là AOP không phải là chủ đạo, và có những chi phí và rủi ro liên quan đến việc sử dụng một công nghệ phi chính thống (AOP được sinh ra vào những năm 90 và OOP vào những năm 60). Như với bất kỳ sự đổi mới nào, các diễn viên khác nhau có sự nhạy cảm khác nhau giữa các rủi ro và lợi ích, vì vậy có thể trở thành những người chấp nhận sớm hoặc muộn.

AOP không phải là trở ngại đối với thử nghiệm đơn vị, nhưng có rất ít trải nghiệm được chia sẻ về chủ đề. Nói chung, các khía cạnh phải được thử nghiệm dưới dạng các đơn vị riêng biệt của mã. Có những khía cạnh thiết yếu và không cần thiết.Thông thường, mã doanh nghiệp phải được kiểm tra cùng với các khía cạnh thiết yếu, nhưng các khía cạnh không cần thiết phải được vô hiệu hóa. Bạn có thể vô hiệu hóa các khía cạnh tĩnh tại thời gian xây dựng (chỉ loại trừ một số khía cạnh từ cấu hình xây dựng) hoặc tại thời gian chạy (làm cho khía cạnh phụ thuộc vào một số biến tĩnh mà bạn đặt thành sai trong khi thử nghiệm).

+1

Bạn có thể tham khảo bất kỳ bài viết nào giải thích chi tiết hơn về khía cạnh thiết yếu và không cần thiết không? – Steven

+1

@Steven Tôi không có một bài viết nào trong đầu. Khái niệm về khía cạnh không cần thiết thực sự được đặt tên là "tư vấn vô hại" trong các tài liệu học thuật. Nó có nghĩa là khía cạnh hoàn toàn trực giao với mục tiêu của nó (mã cơ sở) và có thể được loại bỏ mà không ảnh hưởng đến kết quả của nó. Ví dụ, đăng nhập và giám sát hiệu suất là vô hại, nhưng xử lý giao dịch hoặc INotifyPropertyChanged thì không. –

+0

Khám phá [trang trình bày 12 trong bản trình bày này] (http://www.dantasfiles.com/daniel/research/Harmless%20Advice%20 (FOOL)% 20Slides.pdf) –

Các vấn đề liên quan