首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostSharp点

PostSharp点
EN

Stack Overflow用户
提问于 2011-07-06 14:07:32
回答 1查看 1.4K关注 0票数 2

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

  • 方面是面向对象编程中类的AOP等价物,
  • 组件是面向对象操作中的方法,
  • 点是OOP中的“使用”代码。在OOP中,我们调用事物。在AOP中我们编织东西。由Pointcuts定义的编织位置的决定。

关于实际问题..。

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

代码语言:javascript
复制
[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)]

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

代码语言:javascript
复制
if (!methodName.StartsWith("set_") && !methodName.StartsWith("get_")) {

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

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

假设这是可行的,我仍然在想,为什么我必须硬编码点削减我的建议?方面和建议是定义/实现。节目单是用法。这两个人应该分开。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-06 14:42:21

属性是方法,确切地说是两种方法。记住,PostSharp是在MSBuild将C#转换为C#之后才开始工作的。

您所做的不是在运行时检查,而是在编译时检查。重写CompiletimeValidate()方法并将检查代码移到那里。如果方法匹配,则返回false其他明智的返回true。PostSharp使用此方法(在编译时)确定方面是否将应用于目标。没有必要在运行时发生任何事情。

您也可以使用多播来完成这一任务。有关该PostSharp的detials,请参阅下面的http://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx原则文章

代码语言:javascript
复制
[assembly: MyAspect(AspectPriority = 10)] 
[assembly: MyAspect(AspectPriority = 0,  
    AttributeExclude = true, AttributeTargetMembers = "regex:get_.*|set_.*")]

MethodPointcut (以及其他几个方面)是用于复杂方面的。下周将有一篇关于这些的文章发表。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6597774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档