2014-06-05 1 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; 
     } 
    } 
} 

나는 클래스의 오프라인 상태가 속성이 true 인 경우 OnEntry에 차단하려는. 물론 많은 장치가 있으므로 aspect에 하나의 장치를 주입하는 것이 실현 가능하지는 않습니다.

또한 api이므로 인수로 전달하지 않으려합니다 (someDevice.Start (someDevice.IsOffline)). MethodExecutionArgs를 통해 상태를 얻을 수 있습니다.

답변

2

'args.Instance'는 애스펙트가 적용된 인스턴스를 제공합니다.

사용할 수있는 것으로 이것을 캐스팅해야하며, 모든 수업에 적용되는 인터페이스가 충분해야합니다.

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