PostSharp Pointcuts



在开始之前,我想澄清一下我目前对AOP术语的理解如下…

  • 方面是AOP中类的等价。
  • advice在AOP中相当于OOP中的方法。
  • 切入点在AOP中相当于在OOP中"使用"代码。在OOP中,我们调用事物。在AOP中,我们编织东西。的地方织什么的决定是由切入点定义的。

说到实际问题…

我在PostSharp中有一个日志记录方面,我想在每个方法上使用(编织),不包括属性。最初我在我的方面使用以下代码:

[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)]

然而,我发现方面仍然被编织到属性中,这意味着我必须在运行时执行二次检查,以防止我的代码在属性上执行:

if (!methodName.StartsWith("set_") && !methodName.StartsWith("get_")) {

这并不理想。我应该能够在切入点中定义这种行为,这样我就不必执行任何运行时检查。

我一直在研究MethodPointcut属性,它似乎为我提供了一个回调,以帮助编织器在构建时选择建议的候选项。我能看个例子吗?

假设这确实有效,我仍然在想"为什么我必须硬编码切入点到我的建议?"方面和建议是定义/实现。切点是用法。

属性是方法,确切地说是两个方法。记住,PostSharp是在MSBuild把你的c#变成MSIL之后才开始工作的。

你所做的不是在运行时检查,而是在编译时检查。覆盖CompiletimeValidate()方法并将检查代码移到那里。如果方法匹配,则返回false,否则返回true。PostSharp使用这个方法来确定(在编译时)方面是否将应用于目标。运行时不需要发生任何事情。

您也可以使用组播来实现这一点。有关详细信息,请参阅以下PostSharp principal文章http://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx

[assembly: MyAspect(AspectPriority = 10)] 
[assembly: MyAspect(AspectPriority = 0,  
    AttributeExclude = true, AttributeTargetMembers = "regex:get_.*|set_.*")]

MethodPointcut(以及其他一些)用于复杂的方面。

相关内容

  • 没有找到相关文章

最新更新