2015-11-26 51 views
0

我创建了一个简单的方面:适用于其他装配类方法的方面都需要

[Serializable()] 
public class NullableCallAspect : PostSharp.Aspects.OnMethodBoundaryAspect 
{ 
    public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args) 
    { 
     if (args.Instance == null) 
      args.FlowBehavior = PostSharp.Aspects.FlowBehavior.Return; 
    } 
} 

从本质上讲,我想无论哪instance.method呼叫instance == null它不输入方法。我搞清楚了,我需要改变方面的继承。所以,我需要换一个OnMethodBoundaryAspect。这将是第一个问题。

另一个问题是如何将这个方面应用到继承另一个程序集接口的类的方法调用。

我已经试过这一点,但它不是做得比较工作:

[assembly: UI.Aspects.NullableCallAspect(
    AttributeTargetAssemblies = "UIAppearanceExtensibility", 
    AttributeTargetTypes = "UI.Appearance.Extensibility.*.I*AppearanceManager", 
    AttributeTargetMembers = "handle*" 
)] 

回答

1

这种方面将要求其不受PostSharp支持通话网站拦截。 OnMethodBoundaryAspect和MethodInterceptionAspect都修改目标方法不会调用网站本身 - 在调用由这些方面装饰的方法时仍然需要实例。

编辑: 有一个黑客如何强制PostSharp拦截呼叫站点。当一个方面被组装成不同类型的装配时。如果所有方法都在项目实施ClassLibrary1的,他们是从为MyApplication项目,然后方面可以MyApplication的项目进行多播这样就叫:

[assembly: 
    NullableCallAspect(AttributeTargetAssemblies = "ClassLibrary1", AttributeTargetTypes = "ClassLibrary1.*", 
     AttributeTargetMembers = "handle*", AttributeTargetElements = MulticastTargets.Method)] 

如果有一个惯例,所有的实施IAppearanceManager端具有后缀名AppearanceManager然后组播需要改变:

[assembly: 
    NullableCallAspect(AttributeTargetAssemblies = "ClassLibrary1", AttributeTargetTypes = "ClassLibrary1.*AppearanceManager", 
     AttributeTargetMembers = "handle*", AttributeTargetElements = MulticastTargets.Method)] 

如果没有这样的约定,那么IAspectProvider可以用于多播。

当在相同程序集内调用由NullableCallAspect修饰的方法时,此方法不可用 - 在此情况下,呼叫站点不会被拦截。

+0

是的,每个接口都在** ClassLibrary1 **上定义,每个对其方法的调用都是由** MyApplication1 **完成的。正如你可以看到[这里](http://s16.photobucket.com/user/jeusdi/media/snip3.png.html),** MyApplication1 **是'UI'和** ClassLibrary1 **是'UIExtensibility' 。但它不起作用。我不知道如何解决这个问题。 – Jordi

+0

使ClassLibrary1中的所有接口都无法使黑客工作是不够的。所有的接口实现都需要在ClassLibrary1中定义。 –

+0

好的。我想避免检查'null.method'调用。我为我的类型创建了一个虚拟实现,其中IoC不提供任何实现。虚拟实现由NSubstitute代理提供。感谢所有。 – Jordi