0

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

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

1 回答 1

0

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

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

希望有帮助。

于 2013-03-29T13:31:17.803 回答