2009-02-18 35 views
18

Tôi là người mới đến với ý tưởng lập trình hướng-khía cạnh nhưng tôi muốn khám phá ý tưởng sử dụng nó trên dự án của tôi để xử lý ghi nhật ký, báo cáo, v.v. một số câu hỏi:Trợ giúp và Thông tin về Lập trình hướng Aspect

  • Tôi có nên bận tâm khám phá đường dẫn AOP này cho các mục đích hạn chế này không?
  • .NET Framework hỗ trợ AOP nào khả dụng?
  • nào sau đây khuôn khổ hỗ trợ một giao diện thông thạo (tôi ghét XML config) :)
+0

giao diện (API?) phải làm gì với cấu hình XML? –

+0

Giao diện thông thạo có thể thay thế cấu hình xml. xem fluent-nhibernate vs nhiberate. có giao diện thông thạo có nghĩa là nó có thể được tái cấu trúc chẳng hạn. –

+0

[Lập trình hướng khía cạnh] (http://izlooite.blogspot.com/2010/06/aspect-oriented-programming.html#comment-form) –

Trả lời

23

Lập trình hướng khía cạnh không chỉ đơn thuần là ghi nhật ký, báo cáo và cetera, như bạn sẽ thấy nếu bạn xem trang web của PostSharp. Cá nhân tôi đã không làm quá nhiều IL tĩnh dệt, chủ yếu là năng động IL thế hệ để tạo ra AOP interceptors và khi làm như vậy tôi đã chủ yếu được sử dụng nó để bọc và ngăn chặn các giải quyết từ đảo ngược của container kiểm soát.

AOP có thể cải thiện xử lý ngoại lệ, cải thiện truy tìm, cải thiện chặn giao dịch.

NHibernate ví dụ có một loại AOP, mặc dù nó tĩnh ở thời gian biên dịch về xử lý sự kiện đơn giản; nhưng đối với một số sự kiện trong động cơ, bạn có thể gắn các interceptor (còn gọi là các khía cạnh, các sự kiện là các điểm cắt vv) - Tôi sử dụng nó để tiêm, sử dụng các thực thể nghiệp vụ IoC vào các đối tượng miền của tôi.

Các khung công tác AOP mạnh mẽ cho phép bạn khái quát và thậm chí mạnh mẽ hơn cho phép bạn khái quát hóa chi phí trên không khi chạy; về nguyên tắc, bạn có một vài cách khác nhau để thực hiện nó:

(0). (Không thực sự) "pre-processor" AOP aka mẫu trong C++, ifdefs vv

  1. Reflection "AOP"
  2. IL-thế hệ trong thời gian chạy qua Reflection.Emit, đòi hỏi phải có sự tín nhiệm cao. Đây là đường dẫn DynamicProxy2 trong dự án Castle đã thực hiện. DynamicProxy2 là khá tốt đẹp và rất nhiều công việc đã đi vào nó! Ngoài ra, khung chính sách afaik PatternsAndPractices cũng sử dụng cách tiếp cận này, với rất nhiều XML, mặc dù với trình tạo riêng của chúng. NHibernate có sự phụ thuộc vào DynProx2.
  3. Để biên dịch IL + Assembly.Load (...) khi chạy bằng cách sử dụng System.CodeDom.Compiler, sau đó tải assmblies đã tạo của bạn, yêu cầu độ tin cậy cao. Biên dịch với bất kỳ trình biên dịch khác như Boo.Compiler cũng có thể vì nó tạo ra "hội đồng chức năng toàn cầu" mà bạn có thể gọi theo cách 'kịch bản', nhưng bây giờ chúng tôi đang di chuyển ra khỏi AOP một chút.
  4. Profiler API (đừng hỏi tôi về họ)
  5. Dựa vào khuôn khổ thời gian chạy: mở rộng MarshalByRef/ContextBoundObject see link và sử dụng Remoting-cơ sở hạ tầng trong Net để làm AOP, mà là khá phức tạp và phụ thuộc bạn có thể giới thiệu không muốn.
  6. Sau khi biên dịch tĩnh IL-dệt, PostSharp và Mono.Cecil có tương đương với Reflection.Emit, nhưng điều này không có lỗi cho các phương pháp ảo gọi trong lớp con cụ thể (nếu tôi nhớ chính xác) như Reflection.Emit và sẽ sẵn sàng kiểm tra mã của bạn tương tự như Assembly.ReflectionOnlyLoad và cũng sẽ cho phép bạn xuất các hoạt động IL vào mã đó. Đây là một ứng cử viên tốt nếu bạn đang tìm kiếm một cách tiếp cận khá thấp; không đòi hỏi sự tin tưởng cao.
  7. Thêm các điểm mở rộng trong mã được quản lý của bạn để gọi lại C/C++ qua p/invoke, nhưng điều này yêu cầu một số ngoại lệ không vượt qua ranh giới bộ nhớ một cách vui vẻ (thay vào đó, nó sẽ làm hỏng ứng dụng của bạn) và trừ khi bạn đang sử dụng VC++/C# trong Windows với khung công tác ngoại lệ được quản lý, điều này có thể gây ra lỗi nghiêm trọng. Bạn có thể chuyển callback tới C và p/gọi vào C từ C# và có thể chuyển callback từ C sang C# cũng như bạn định nghĩa delegate trong C#. Các điểm mở rộng có lẽ sẽ phải được thực hiện thông qua một điểm cắt IL-weaver + tĩnh hoặc động.

Công dụng trong các giao dịch Có một cái nhìn tại Castle.Facilities.AutomaticTransactionManagement.TransactionFacility kiếm một cách tốt đẹp của việc xử lý các giao dịch sử dụng AOP và khả năng chặn các DynamicProxy2. Các cơ sở giao dịch tích hợp với System.Transcations và System.EnterpriseServices là bạn đang sử dụng điều phối viên giao dịch phân tán (COM-component) để quản lý các giao dịch. Ngoài ra, có nhiều ví dụ về p/gọi vào hạt nhân để chăm sóc TxF and TxR components of the Vista-kernel (aka Server 2008) cho phép bạn sử dụng giao dịch trên NTFS và trên sổ đăng ký, do đó đảm bảo CRUD bạn làm là ACID, cũng tích hợp độc đáo với System.Transactions cho tạo giao dịch lồng nhau.

Sử dụng trong xác minh bất biến Bạn cũng có thể sử dụng chúng để thiết kế theo hợp đồng, bằng cách thêm một số thuộc tính vào thông số của bạn.

public void PerformOperation([NotNull, NotEmpty] string value) { 
// use string 
[NotNull] return new string(' ', 5); // can return with attributes as well 
} 

Vấn đề với điều này tại thời điểm này là phí của việc gắn siêu dữ liệu này và kiểm tra trong thời gian chạy. Tuy nhiên, bạn có thể chỉ định khía cạnh kiểm tra ràng buộc chỉ được áp dụng khi bạn đang biên dịch với DEBUG và sau đó dữ liệu meta này sẽ không dẫn đến hiệu suất giảm sút nhiều.

Nếu bạn đang tìm kiếm để có được bằng chứng tiên đề, hãy xem Sing #/SpeC# để thay thế, vì đó chính thức hơn và công việc được thực hiện bởi trình biên dịch.

Những điều cần phải nhận thức của Điểm quan trọng nhất là nhận thức được rằng nếu một mối quan tâm, ví dụ một số đoạn mã mà chạy trước hoặc sau khi phương pháp của bạn được thay đổi kiểm soát dòng chảy, có thể trở về một loại bất ngờ , trả lại quá sớm hoặc nói chung không hành xử theo ý định của phương thức bạn đang gọi, bạn có thể gặp phải các lỗi khó gỡ lỗi.

Ngoài ra, hãy cẩn thận với việc ném ngoại lệ từ các thuộc tính, bởi vì bạn không bao giờ biết khi nào hoặc từ việc lắp ráp nào, sự phản chiếu xảy ra; sự phản ánh trên thuộc tính của bạn có thể không xảy ra khi bạn mong đợi. Điều này xảy ra với bản thân mình khi tôi gắn các loại thuộc tính và cẩn thận kiểm tra chúng. Ngoài ra hãy cẩn thận với thực tế là bạn đang mở một vectơ tấn công có thể trong việc thêm "các điểm cắt" toàn cầu, nếu ai đó truy cập vào, có thể được sử dụng để chuyển hướng các phần lớn của hệ thống của bạn.

khuôn khổ khác Nếu bạn muốn tìm hiểu thêm về AOP nói chung tôi khuyên bạn nên kiểm tra bài thuyết trình Rickard Oberg về Qi4J, đó là một khuôn khổ rất tốt trong Java cho AOP (java có ngữ nghĩa đối tượng kế thừa hơi khác nhau mặc dù mà làm cho một chút tricker wee để sử dụng trong C#/F #/Nermle/Boo bất cứ điều gì.

AOP + AddIns một khả năng thú vị trong việc sử dụng lập trình hướng khía cạnh với cụm runtime tạo như những dynamicproxy2 tạo, là bạn cũng có thể sử dụng chúng để bọc các đối tượng vượt qua các ranh giới ứng dụng, reby đơn giản hóa việc tạo một add-in-pipeline. Tôi đã bí mật hy vọng rằng Microsoft sẽ sử dụng điều này khi họ tạo AddIn-framework cho 3.5, nhưng họ đã chọn cách tạo mã tĩnh không may, dẫn đầu một chi phí khá lớn trong việc tạo các add-in cho nhà phát triển. Vấn đề là một loại được nạp cho "nhiều hơn sự phản chiếu" vào một AppDomain không thể được dỡ bỏ một lần nữa trừ khi AppDomain hoàn chỉnh được dỡ xuống, vì vậy bạn cần 1) để phản ánh trên plugin mà không tải nó để xem những gì nó có khả năng trừ khi bạn cho phép nhiều siêu dữ liệu thủ công được viết hoặc được tạo ra (và tin vào điều đó) và 2) một số đối tượng để giữ tay cầm cho đối tượng của bạn để nó không được GC và bạn không biết loại (do đó, lắp ráp IContract và AddInHandle-class) - điều này có thể được thực hiện một cách tốt đẹp với proxy động/AOP.

Sử dụng AOP để thu thập rác toàn cầu ... trong hệ thống phân tán chạy trên linux/windows trên cơ sở hạ tầng ngôn ngữ chung. Bài viết hơi khó tải xuống để I uploaded it to my server vì vậy tôi biết nó ở đâu.

bài Scriptum (Nếu bạn đang sử dụng một ngôn ngữ phi tiêu chuẩn trên CLR và không phải là DLR IL-dệt có thể tạo phi tiêu chuẩn mã thích hợp. Đặc biệt thú vị cho F #, tôi nghĩ rằng, bởi vì việc sử dụng một lot mã không chuẩn để mang lại lợi ích to lớn cho ngôn ngữ (tuples nói) - bạn có thể đánh dấu hội đồng của mình với [assembly: CLSCompliant] nếu bạn muốn nhận cảnh báo thời gian biên dịch về điều này.)

+0

wow! lời giải thích tuyệt vời. những gì tôi đã hy vọng và nhiều hơn nữa. cảm ơn! –

+0

nhận xét tuyệt vời. Rất đẹp. – CmdrTallen

1

AOP là thú vị với tôi là tốt. Dường như với tôi rằng việc ghi nhật ký và giám sát hiệu suất, báo cáo là rất nhiều những gì AOP được thiết kế để xử lý. Đối với .NET, Post Sharp là một khung công tác rất tốt cho AOP.

Tôi chỉ thử nghiệm một chút nhưng có vẻ như đã được triển khai rất tốt.

0

Đừng nghĩ điều gì đó hoàn toàn khác biệt. AOP cải thiện (IMO) thiết kế của bạn bằng cách giảm khớp nối, tăng sự gắn kết, quan tâm riêng biệt bằng cách đưa ra một đối tượng của một loại trách nhiệm nhất định. Nếu bạn đến từ .net world PostSharp sử dụng các thuộc tính tùy chỉnh để dệt lời khuyên. Nếu bạn đến từ thế giới Java, bạn có thể sử dụng phần mở rộng Java có tên là AspectJ. AOP có nhiều ứng dụng hơn những gì bạn thấy thường thấy.

1

Nếu bạn định xem Post Sharp, bạn có thể tải xuống Google Book Downloader từ CodePlex. Tôi nghĩ rằng dự án này sử dụng nó.

2

Tôi không thể nói cho các chi tiết cụ thể của .NET, nhưng AOP và ý tưởng chung hơn là có thể đính móc vào phương pháp tùy ý, là một kỹ thuật tiện dụng có thể giải quyết một số vấn đề khác.

Một ví dụ là design by contract. Giả sử bạn có một loạt các phương pháp mà bạn muốn áp dụng một số hợp đồng phổ biến. Bạn có thể thêm một số "lời khuyên" (từ AOP) trước và sau mỗi phương thức được gọi mà không phải cắt & dán nó vào mọi phương thức.

Trong khi thử nghiệm, nó thường hữu ích để biết những gì đang xảy ra trong một số phương pháp nội bộ. Đã bao nhiêu lần nó được gọi và có thể nó đã trở lại như thế nào. Bạn có thể thêm một khía cạnh để thực hiện việc giám sát đó mà không phải thêm mã kiểm tra mất tập trung vào chính phương thức đó. Việc chỉnh sửa mã cho phương thức đó thậm chí không thể thực hiện được.

Chỉ xem ra cách các khía cạnh được triển khai. Một số triển khai là các bộ xử lý trước phức tạp có thể làm cho việc gỡ lỗi mã của bạn phức tạp hơn. Những người khác móc trơn tru vào ngôn ngữ. Ngôn ngữ động xử lý AOP rất tốt. Perl có Aspect.pm cho AOP và tổng quát hơn Hook::LexWrap để hoàn thành móc phương thức.

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