如何连接IAspectProvider,以便PostSharp使用它

本文关键字:PostSharp 以便 IAspectProvider 何连接 连接 | 更新日期: 2023-09-27 18:33:00

我用C#编写了一个实现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()));
        }
    }
}

如何连接IAspectProvider,以便PostSharp使用它

对于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

附言我们还将查看方面提供商的文档页面,并添加有关使用情况的信息。