2009-03-11 39 views
71

Có rất nhiều triển khai AOP trong C#, VB.net. đây là một số AOP Triển khai:Triển khai tốt nhất cho AOP trong .Net là gì?

Triển khai tốt nhất cho AOP trong .Net là gì? Những gì tôi nên sử dụng?

+4

Sẽ rất hữu ích nếu bạn cung cấp liên kết đến tất cả AOP, để tiết kiệm cho người đọc một chút thời gian với Google. Tôi hy vọng câu hỏi/câu trả lời này sẽ trở thành một bản tóm tắt tuyệt vời về các tùy chọn AOP khác nhau trong .NET –

+9

52 người đã bình chọn đó là một câu hỏi mang tính xây dựng. 5 bình chọn nó không mang tính xây dựng. Ai quyết định? Ít nhất người điều hành nên thay đổi hoặc cải cách câu hỏi, nhưng họ nên cân nhắc hầu hết ý kiến ​​của mọi người. – Revious

+2

@Revious Hoàn toàn đồng ý! – Legends

Trả lời

38

Tôi nghĩ rằng Castle Dynamic Proxy là giải pháp được lựa chọn nếu đánh chặn động có thể xử lý nhu cầu của bạn. Khuôn khổ này được sử dụng nội bộ bởi rất nhiều khung công tác khác mà muốn cung cấp khả năng AOP. Thông thường, hầu hết các container IoC hiện có cung cấp một số cơ chế đánh chặn động (Spring.NET, Castle Windsor, StructureMap, vv) Nếu bạn đã làm việc với một thùng chứa IoC, có thể dễ dàng hơn khi nhìn vào những gì nó đề xuất.

Nếu đánh chặn động không thể giải quyết nhu cầu của bạn (dệt lớp kín, chặn cuộc gọi không ảo, v.v.), thì bạn chắc chắn muốn dệt tĩnh. PostSharp là tham chiếu trong miền này.

Lưu ý rằng nó cũng tồn tại Linfu, có thể được sử dụng để tận dụng cả thời trang AOP.

+2

+1 trên đó nếu bạn muốn làm AOP thời gian chạy. +1 trên PostSharp nếu bạn muốn thời gian biên dịch sau AOP –

+0

Mọi cập nhật về câu trả lời này? Hoặc điều này vẫn còn hợp lệ? Tôi đã đặc biệt tự hỏi làm thế nào mùa xuân.Aop so sánh với Castle và PostSharp –

+1

không may, PostSharp là một sản phẩm thương mại – pixel

12

"Tốt nhất" là chủ quan.

Trước tiên, hãy lập danh sách các tính năng bạn cần, kiến ​​trúc của bạn, v.v. Sau đó, tìm các tùy chọn thực hiện những gì bạn cần mà không cần phải đưa ra sự phức tạp không cần thiết. Ví dụ: một số định hướng giao diện: mã của bạn hiện có định hướng giao diện không? Nếu không, PostSharp có thể là một lựa chọn tốt hơn (được dệt vào các lớp gốc). Nhưng tất nhiên, PostSharp không thể được cấu hình trong thời gian chạy ... ngựa cho các khóa học.

+0

bạn có thể cải cách những gì bạn đã nói như sau: "Tốt nhất là chủ quan, tôi sẽ đưa ra một danh sách các chuyên gia và contros cho một số khuôn khổ này". – Revious

4

Tôi không biết nhiều nhất, có rất nhiều khung công tác và không đủ giờ trong ngày để thử tất cả.

Tôi đã sử dụng PostSharp và thật ngạc nhiên về việc bắt đầu với nó dễ dàng như thế nào.

Tôi cũng đã xem xét AOP với Castle Windsor và Spring.Net, cách tiếp cận này là khác nhau (thời gian chạy so với biên dịch). Trộn AOP và IoC có vẻ hợp lý. Khi bạn không sử dụng một trong các khung công tác này, bạn cần phải làm nhiều việc hơn để bắt đầu nhưng đừng để điều đó ngăn cản bạn.

Đối với các dự án mới bây giờ tôi có thể sử dụng Castle Windsor, nhưng đó là chủ yếu là vì tôi cũng muốn sử dụng IoC. Nếu tôi đã nhanh chóng thực hiện AOP vào một cơ sở mã hiện có tôi muốn sử dụng PostSharp.

11

Cách tốt nhất để lập trình hướng-khía cạnh trong .NET là sử dụng các kỹ thuật thiết kế nổi tiếng. Ví dụ, bằng cách áp dụng các SOLID principles bạn có thể đạt được sự linh hoạt và mô-đun bạn cần để cho phép thêm mối quan tâm xuyên suốt. Nếu bạn có quyền thiết kế, thậm chí bạn sẽ có thể áp dụng hầu hết các mối quan tâm xuyên suốt mà không có bất kỳ khung công tác nào. Đó là một sai lầm khi nghĩ rằng OOP là không phù hợp để làm AOP.

Dưới đây là một số gợi ý:

  • Đừng phụ thuộc vào trường hợp cụ thể, nhưng phụ thuộc vào trừu tượng.
  • Đừng trộn lẫn các mối quan tâm chéo và logic nghiệp vụ trong cùng một lớp.
  • Thêm mối quan tâm chéo bằng cách gói các lớp học với logic nghiệp vụ trong các lớp học triển khai các mối quan tâm đó (decorators).
  • Tìm các hiện vật phổ biến trong thiết kế của bạn và mô hình hóa chúng bằng nhau, tốt nhất là sử dụng cùng một loại trừu tượng. Hãy xem ví dụ thisthis.

Khi bạn đã có được sự trừu tượng đúng tại chỗ, thêm mối quan tâm cắt ngang mới vào hệ thống chỉ là vấn đề viết một lớp trang trí mới và gói nó xung quanh việc triển khai đúng. Nếu trừu tượng là chung chung, bạn có thể bọc một trang trí đơn xung quanh một nhóm lớn các lớp (mà chính xác là những gì AOP là về).

Mặc dù các kỹ thuật như proxy động và dệt mã có thể làm việc dễ dàng hơn với ứng dụng được thiết kế kém, thực sự không có sự thay thế nào cho thiết kế tốt. Sớm hay muộn bạn sẽ bị đốt cháy. Điều này không có nghĩa là việc tạo mã động và tạo mã động không nên được sử dụng. Nhưng nếu không có một thiết kế ứng dụng thích hợp ngay cả những kỹ thuật đó sẽ chỉ hữu ích một chút.

+0

AOP là cấp độ trừu tượng tiếp theo. Trong thực tế, đó là giới hạn của thừa kế và thành phần dẫn đến AOP. Bạn đã thấy khối ngoại lệ Entlib chưa? Aspect sạch hơn rất nhiều so với việc gọi khối chết tiệt đó cho mỗi cuộc gọi vào cơ sở dữ liệu, chỉ để thử-catch-log-throw. –

+2

Nếu bạn gói mọi cuộc gọi vào cơ sở dữ liệu của mình bằng một khối ngoại lệ, bạn vẫn đang làm sai. Nó trở lại với thiết kế tốt. Luôn luôn. – Steven

+0

Vì vậy, thay vì bắt ngoại lệ db thì cách nào đúng? – OutOFTouch

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