2014-06-05 24 views
2

是否可以在某个方面使用方面引用类的属性?对OnMethodBoundaryAspect中的类属性的引用

下面的例子:

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; 
     } 
    } 
} 

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

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

回答

2

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

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

1

另一个可用选项是将属性从目标类“导入”到该方面,如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() 
    { 
    } 
} 
+0

有趣,谢谢。 – vknapp