引用OnMethodBoundaryAspect中的类属性

时间:2014-06-05 08:54:17

标签: c# .net postsharp aop

是否可以使用方面在一个方面引用类的属性?

以下示例:

public class Device
{
    public bool IsRunning { get; set; }
    public bool IsOffline { get; set; }

    [Offline]
    public void Start()
    {
        IsRunning = true;
    }

    [Offline]
    public void Stop()
    {
        IsRunning = false;
    }
}

[Serializable]
public class Offline : OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionArgs args)
    {
        // should be something like
        if (device.IsOffline)
        {
            args.FlowBehavior = FlowBehavior.Return;
        }
    }
}

如果类的IsOffline属性为true,我想拦截OnEntry。 当然有很多设备,因此在这方面注入一个设备似乎不可行。

另外,因为它是一个api我不想把它作为参数传递(someDevice.Start(someDevice.IsOffline)),我可以通过它的MethodExecutionArgs获取状态。

2 个答案:

答案 0 :(得分:3)

'args.Instance'将为您提供已应用方面的实例。

您需要将其转换为您可以使用的内容,应用于所有类的Inteface应该足够了。

答案 1 :(得分:1)

另一种选择是" import"从目标类到方面的属性,如this documentation page所述。您需要实现IInstanceScopedAspect界面,添加一个新的公共字段来保存"导入"属性并使用ImportMemberAttribute标记该字段。

[Serializable]
public class Offline : OnMethodBoundaryAspect, IInstanceScopedAspect
{
    [ImportMember("IsOffline", IsRequired = true)]
    public Property<bool> IsOffline;

    public override void OnEntry(MethodExecutionArgs args)
    {
        if (this.IsOffline.Get())
        {
            // ...
        }
    }


    // IInstanceScopedAspect implementation below:

    public object CreateInstance(AdviceArgs adviceArgs)
    {
        return this.MemberwiseClone();
    }

    public void RuntimeInitializeInstance()
    {
    }
}