PostSharp切入点

时间:2011-07-06 14:07:32

标签: c# .net postsharp aop

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

  • 方面是OOP中等级的AOP。
  • 建议是与OOP中的方法等效的AOP。
  • 切入点是AOP等效于OOP中的“使用”代码。在OOP中我们调用东西。在AOP中我们编织东西。 编织 的决定由Pointcuts定义。

在实际问题上......

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

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

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

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

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

我一直在查看MethodPointcut属性,它似乎为我提供了回调,以帮助编织者在构建时选择候选人。 我可以看一个例子吗?

假设这确实有效,我仍然在想'为什么我必须将切入点硬编码到我的建议中?'。方面和建议是定义/实施。切入点是用法。这两者应该是分开的。

1 个答案:

答案 0 :(得分:3)

属性ARE方法,两种方法准确。请记住,PostSharp在MSBuild将您的C#转换为MSIL之后才能正常工作。

您所做的不是在运行时检查,而是在编译时检查。覆盖 CompiletimeValidate()方法并将检查代码移到那里。如果方法匹配,则返回false,否则返回true。 PostSharp使用此方法确定(在编译时)方面是否将应用于目标。没有什么必须在运行时发生。

您也可以使用多播来完成此操作。有关http://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx

的详细信息,请参阅以下PostSharp Principals文章
[assembly: MyAspect(AspectPriority = 10)] 
[assembly: MyAspect(AspectPriority = 0,  
    AttributeExclude = true, AttributeTargetMembers = "regex:get_.*|set_.*")]

MethodPointcut(以及其他一些)适用于复杂方面。下周将会有一篇关于这些文章的文章。