2016-02-02 35 views
2

我已經在C#中編寫了一個實現PostSharp的IAspectProvider接口的類。我不明白的是現在我應該用它來做什麼。我似乎無法在PostSharp的網站上找到任何文檔,告訴我在編寫該類時如何處理這個類。如何連接IAspectProvider以便PostSharp使用它?

PostSharp是否會自動找到這個類,因爲它源自IAspectProvider並使用它?還是有一個鏈接可用於我目前無法找到的頁面?

FWIW,該課程在下面提供。 (MethodTracingAspect我們正在使用的培訓我們的定製方面。)

namespace LoggingSample 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 

    using PostSharp.Aspects; 

    internal class ProviderAspect : IAspectProvider 
    { 
     public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
     { 
      var type = (Type) targetElement; 

      return type.GetMethods() 
         .Where(m => type.IsAssignableFrom(typeof(IReportBuilder)) 
            && m.IsPublic 
            && m.Name == "Execute") 
         .Select(m => new AspectInstance(targetElement, 
                 new MethodTracingAspect())); 
     } 
    } 
} 

回答

1

對於PostSharp,實現IAspectProvider一類只是一個方面,你需要將其應用到目標以同樣的方式與任何其他方面的因素。因此,通常情況下,您的方面提供者類也應該從其中一個屬性類派生。然後,您可以將它作爲屬性應用於目標元素,並且在構建時將此元素傳遞到ProvideAspects方法。

在你的具體例子中,你可以從TypeLevelAspect得到,因爲你期望你的targetElement是一個類型。

方面提供的一個例子是可用此文檔頁面:http://doc.postsharp.net/example-dataattributes

方面使用示例:

// Aspect class 
[Serializable] 
public class ProviderAspect : TypeLevelAspect, IAspectProvider 
{ 
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
    { 
     // ... 
    } 
} 

// Apply to a single type 
[ProviderAspect] 
public class TargetClass : IReportBuilder 
{ 
    public void Execute() 
    { 
     // ... 
    } 
} 

// Apply to many types 
[assembly: ProviderAspect (AttributeTargetTypes="OurCompany.OurApplication.Reports.*")] 

你可以找到關於這個文檔頁面上應用方面到您的代碼的詳細信息: http://doc.postsharp.net/applying-aspects

PS我們還將審查我們的方面提供商的文檔頁面並添加有關使用情況的信息。

+0

我想我理解了大部分內容(正如我發現的原始文章所述,涉及到一些心理體操)。但是,一旦寫完了,我還不清楚該怎麼處理這門課。您提供的鏈接示例僅提供了'IAspectProvider'的實現。這個方面是否需要從'AssemblyInfo.cs'明確引用?我需要裝飾一個或兩個類型的方面?或者PostSharp會在編譯時自動找到提供程序,並使用它,因爲它來自'IAspectProvider'? –

+0

好吧,我已經用一個例子更新了答案。對不起,第一個答案並不完全清楚。 – AlexD

+0

也你不需要assemblyinfo提供方面。一個例子是用IAspectProvider方面來裝飾一個類,並且它也會在類中使用所有方法(使用反射)來添加方面。您只需要任何入口點到您的代碼爲您的IAspectProviders運行 – Batavia

相關問題