2014-07-06 9 views
0

도메인 개체 :Ninject. 내부 설정 - 속성에 이상한 차단

TargetObject.cs

public class TargetObject 
    { 
     public virtual ChildTargetObject ChildTargetObject 
     { 
      get { return ChildTargetObjectInner; } 
      set { ChildTargetObjectInner = value; } 
     } 

     public virtual ChildTargetObject ChildTargetObjectInner { get; set; } 
    } 

구성 및 테스트 : 마지막 줄에서

 var settings = new NinjectSettings 
     { 
      InjectNonPublic = true, 
      AllowNullInjection = true 
     }; 
     var kernel = new StandardKernel(settings); 

     kernel.Bind<TargetObject>().ToSelf(); 

     kernel.InterceptReplaceSet<TargetObject>(t => t.ChildTargetObjectInner, 
       (inv) => 
       { 
        inv.Proceed(); // <= we never step here. Why? 
       } 
      ); 


     var o = kernel.Get<TargetObject>(); 

     o.ChildTargetObject = new ChildTargetObject(); 

우리는 변화 속성 이 ChildTargetObject 그리고 내부 속성이 변경됩니다. ChildTargetObjectInner. 그러나 우리는 그것의 가로 채기를하지 않았다. 왜?

근처의 "가상"을 제거하면 ChildTargetObject 잘 작동합니다 (하지만 NHiber를 사용하기 때문에이 해결 방법은 불가능합니다).

내가 ChildTargetObjectInner을 변경하는 경우 직접 (예는, o.ChildTargetObjectInner = 새로운 ChildTargetObject();) 년은 절편을 얻었다.

변경 사항을 (클래스 및 클래스를 벗어난) 가로 채기하려면 어떻게해야합니까? 고맙습니다.

답변

0

프록시 프레임 워크의 제한 사항과 ninject가 프록시를 만드는 방법에 대한 제한 사항입니다.

메소드에 virtual이 있으면 메소드가 프록시/인터셉트됩니다. 그러나 virtual을 제거하면 메소드가 더 이상 프록 싱/인터셉트되지 않습니다.

이제 다른 (프록시 된) 메소드를 호출하는 프록시 메소드는 프록시 메소드를 호출하지 않고 구현을 호출합니다. 그래서 당신은 이것을 가로 챌 수 없습니다.

아마도 성 동적 프록시를 사용하고있을 것입니다. Krzysztof는 그것에 대해 very good tutorial을 작성했으며 가상 및 비 가상 방법에 대해서도 설명합니다.

NHibernate를 사용하고 있기 때문에, NHibernate는 또한 프록시를 생성합니다. 이제 새 엔티티를 만들 때 ninject를 통해 만들 수 있습니다. 그러면 ninject가 프록시를 가로 채고 차단을 구성합니다. 그러나 데이터베이스에서 지속 된 엔티티를 검색하면 NHibernate에서 생성됩니다. 또한 프록시를 사용하여 인터셉터를 배치합니다. 그러나 ninject의 프록시에 대해서는 알지 못하므로 이러한 인터셉터를 추가하지 않습니다. 이에 대해, 당신은 다른 방법도 사용하여 방법을 장식 할 수


을 조사 할 수 있습니다 Fody MethodDecorator