postsharp是否提供了一种简单的方法来应用一组方面

Does postsharp provide a simple way to apply a group of aspects

我找了又找,虽然看起来很简单,但我什么也没找到。

基本上我有 4 或 5 个方面,它们通常一起应用于相同的方法,但也需要保持分开,因为它们在许多地方也需要单独使用。

postsharp 是否提供任何表示 'Adding this aspect to a method is the equivalent of adding these 4 other aspects together' 的方式?

我知道你可以将方面组合成一个方面,但我不希望在组合方面和非组合方面中有重复的代码,我同样不希望在方法上声明的一整堆方面混乱.

如果有人能提出任何建议,那将是一个很大的帮助。 提前致谢。

最简单的选择是在占位符方面实现 IAspectProvider 接口:

[Serializable]
public class CombinedAspect : MethodLevelAspect, IAspectProvider
{
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
    {
        yield return new AspectInstance(targetElement, new FirstAspect());
        yield return new AspectInstance(targetElement, new SecondAspect());
    }
}

如您所见,这个界面是一个非常强大的工具。此外,您可能想知道声明中是否确实存在一个方面。这可以使用 IAspectRepositoryService 服务来完成:

[Serializable]
public class CombinedAspect : MethodLevelAspect, IAspectProvider
{
    private int count = 0;

    public IEnumerable<AspectInstance> ProvideAspects( object targetElement )
    {
        IAspectRepositoryService repositoryService = PostSharpEnvironment.CurrentProject.GetService<IAspectRepositoryService>();

        if ( !repositoryService.HasAspect( targetElement, typeof(FirstAspect) ) )
            yield return new AspectInstance( targetElement, new FirstAspect() );

        if ( !repositoryService.HasAspect( targetElement, typeof(SecondAspect) ) )
            yield return new AspectInstance( targetElement, new SecondAspect() );
    }
}

但是,此服务仅从 PostSharp 4.0 开始可用。