c# - PostSharp 切入点

标签 c# .net postsharp aop

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

  • 方面在 AOP 中相当于 OOP 中的类。
  • 建议相当于 OOP 中的方法的 AOP。
  • 切入点在 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 校长文章 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(以及其他一些方法)适用于复杂的方面。下周将会有一篇关于这些的文章发表。

关于c# - PostSharp 切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6597774/

相关文章:

c# - Dapper TypeHandler.SetValue() 未被调用

c# - 赋予枚举静态属性

c# - 使用 Isolated COM 时应用程序在 CoCreateInstance 期间挂起

c# - SimpleStub 中 MockBehavior.Loose 和 MockBehavior.Strict 有什么区别?

c# - 如何使用 OnException 方面(PostSharp)继续方法流程?

c# - Breezejs 加载具有相关数据的实体时出错

c# - 使用泛型方法返回 list<T>,其中 T 可以是共享相同结构的三种类型之一

c# - 已签名的超值的解析器?

PostSharp - 跨程序集应用方面

serialization - SignalR 和序列化对象数组