在postharp中创建全局方面

时间:2013-03-29 11:35:05

标签: postsharp aop

我正在寻找一种在项目中的许多地方运行方法的方法,而不必手动将属性标记添加到每个方法或类中。

我的整个解决方案包含大约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
    {

1 个答案:

答案 0 :(得分:0)

不幸的是,您只能将属性应用于当前编译的程序集(或通过TargetAssembly属性调用其他程序集,但这也仅影响当前编译的程序集)。

我认为最简单的解决方案是将GlobalAspects.cs链接到您希望受其影响的所有项目。这应该按照您的预期工作,不会造成任何问题。

希望有所帮助。