将方面应用于其他程序集 class 方法调用
apply an aspect to other assembly class methods calls
我创建了一个简单的方面:
[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*"
)]
这种方面需要 PostSharp 不支持的调用站点拦截。 OnMethodBoundaryAspect 和 MethodInterceptionAspect 都修改目标方法而不是调用站点本身 - 调用由这些方面装饰的方法时仍然需要实例。
编辑:
有一个 hack 如何强制 PostSharp 拦截呼叫站点。这是当一个方面被多播到不同程序集中的类型时。如果所有方法都在项目 ClassLibrary1 中实现并且它们仅从 MyApplication 项目中调用,那么可以在 MyApplication[ 中多播方面=29=] 像这样的项目:
[assembly:
NullableCallAspect(AttributeTargetAssemblies = "ClassLibrary1", AttributeTargetTypes = "ClassLibrary1.*",
AttributeTargetMembers = "handle*", AttributeTargetElements = MulticastTargets.Method)]
如果约定所有 IAppearanceManager end 的实现都具有后缀 AppearanceManager 的名称,则需要更改多播:
[assembly:
NullableCallAspect(AttributeTargetAssemblies = "ClassLibrary1", AttributeTargetTypes = "ClassLibrary1.*AppearanceManager",
AttributeTargetMembers = "handle*", AttributeTargetElements = MulticastTargets.Method)]
如果没有这样的约定,则可以使用 IAspectProvider 进行多播。
当在同一程序集中调用由 NullableCallAspect 装饰的方法时,这将不可用 - 在这种情况下不会拦截调用站点。
我创建了一个简单的方面:
[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*"
)]
这种方面需要 PostSharp 不支持的调用站点拦截。 OnMethodBoundaryAspect 和 MethodInterceptionAspect 都修改目标方法而不是调用站点本身 - 调用由这些方面装饰的方法时仍然需要实例。
编辑: 有一个 hack 如何强制 PostSharp 拦截呼叫站点。这是当一个方面被多播到不同程序集中的类型时。如果所有方法都在项目 ClassLibrary1 中实现并且它们仅从 MyApplication 项目中调用,那么可以在 MyApplication[ 中多播方面=29=] 像这样的项目:
[assembly:
NullableCallAspect(AttributeTargetAssemblies = "ClassLibrary1", AttributeTargetTypes = "ClassLibrary1.*",
AttributeTargetMembers = "handle*", AttributeTargetElements = MulticastTargets.Method)]
如果约定所有 IAppearanceManager end 的实现都具有后缀 AppearanceManager 的名称,则需要更改多播:
[assembly:
NullableCallAspect(AttributeTargetAssemblies = "ClassLibrary1", AttributeTargetTypes = "ClassLibrary1.*AppearanceManager",
AttributeTargetMembers = "handle*", AttributeTargetElements = MulticastTargets.Method)]
如果没有这样的约定,则可以使用 IAspectProvider 进行多播。
当在同一程序集中调用由 NullableCallAspect 装饰的方法时,这将不可用 - 在这种情况下不会拦截调用站点。