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

时间:2015-01-30 12:09:11

标签: c# postsharp

我搜索过并搜索过,但即使看起来很简单,我找不到任何东西。

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

postsharp是否提供了任何方式来说'将此方面添加到方法相当于将这4个其他方面添加到一起'?

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

如果有人可以提出任何有用的建议。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

最简单的选择是在占位符方面实施 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以后。