2013-03-29 79 views
0

我正在尋找一種方法,可以在我的項目中的許多地方的方法上運行所有方面,而無需手動將屬性標記添加到每個方法或類中。在postsharp中創建全局方面

我的整個解決方案包含大約20個獨立的項目。其中一個我創建了一個叫做myname.space.Attributes持有我的屬性聲明,以及一個名爲GlobalAspects它具有如下:

using PostSharp.Patterns.Diagnostics; 
using PostSharp.Extensibility; 
using myname.space.Attributes; 

// This file contains registration of aspects that are applied to several classes of this project. 
[assembly: TraceLoggingAttribute(AttributeTargetTypes = "myname.space.Controllers.*", 
          AttributeTargetTypeAttributes = MulticastAttributes.AnyVisibility, 
          AttributeTargetMemberAttributes = MulticastAttributes.AnyVisibility) 
] 

[assembly: TraceLoggingAttribute(AttributeTargetTypes = "myname.space.Repositories.*", 
          AttributeTargetTypeAttributes = MulticastAttributes.AnyVisibility, 
          AttributeTargetMemberAttributes = MulticastAttributes.AnyVisibility) 
] 

這樣做的目的是我TraceLoggingAttribute添加到所有方法在這些其他2個項目,控制器和存儲庫中進行。

我已經設置了這兩個其他項目來引用Attributes項目,如果我把[TraceLoggingAttribute]標籤放在Controller和Repositories項目中的類和方法上,這個屬性就可以很好地工作。

有沒有一種方法可以讓我的GlobalAspects.cs以我想要的方式工作?請問的問題,如果我沒有解釋的問題不夠好,這裏

對於感興趣的TraceLoggingAttribute被定義爲:

namespace myname.space.Attributes 
{ 
    [MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)] 
    [Serializable] 
    public class TraceLoggingAttribute : OnMethodBoundaryAspect 
    { 

回答

0

不幸的是,你只能將屬性應用於當前編譯的程序集(或調用其他組件通過TargetAssembly屬性,但也隻影響當前編譯的程序集)。

我認爲最簡單的解決方案是將GlobalAspects.cs鏈接到您希望受其影響的所有項目。這應該如你所期望的那樣工作並且不會引起任何問題。

希望有所幫助。

+0

那麼你的意思是在每個項目中本質上都有一個GlobalAspects,cs? – Thewads