在开始之前,我想澄清一下,我目前对AOP术语的理解如下…
关于实际问题..。
我在PostSharp中有一个日志方面,我想在每个方法上使用(编织),不包括属性。最初,我在我的方面使用了以下内容:
[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)]但是,我发现这个方面仍然被编织到属性中,这意味着我必须在运行时执行一个二级检查,以阻止代码在属性上执行:
if (!methodName.StartsWith("set_") && !methodName.StartsWith("get_")) {这并不理想。我应该能够在切入点中定义这个行为,这样我就不必执行任何运行时检查了。
我一直在研究MethodPointcut属性,它似乎为我提供了一个回调,以帮助编织者在构建时为建议选择候选人。能给我举个例子吗?
假设这是可行的,我仍然在想,为什么我必须硬编码点削减我的建议?方面和建议是定义/实现。节目单是用法。这两个人应该分开。
发布于 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原则文章
[assembly: MyAspect(AspectPriority = 10)]
[assembly: MyAspect(AspectPriority = 0,
AttributeExclude = true, AttributeTargetMembers = "regex:get_.*|set_.*")]MethodPointcut (以及其他几个方面)是用于复杂方面的。下周将有一篇关于这些的文章发表。
https://stackoverflow.com/questions/6597774
复制相似问题