2009-09-03 3 views

답변

65
[Fact] 
    public void CtorArgTestResolveAtGet() 
    { 
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<IWarrior>().To<Samurai>(); 
     var warrior = kernel 
      .Get<IWarrior>(new ConstructorArgument("weapon", new Sword())); 
     Assert.IsType<Sword>(warrior.Weapon); 
    } 

    [Fact] 
    public void CtorArgTestResolveAtBind() 
    { 
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<IWarrior>().To<Samurai>() 
      .WithConstructorArgument("weapon", new Sword()); 
     var warrior = kernel.Get<IWarrior>(); 
     Assert.IsType<Sword>(warrior.Weapon); 
    } 
+1

ResolveAtGet을 사용하여 객체 그래프에서 객체에 깊이 매개 변수를 전달할 수 있습니까? – Zach

+0

Get 메서드 호출은 해결할 최상위 항목에만 매개 변수를 전달합니다. 그 외에도 체인에서 더 깊이있는 객체에 매개 변수를 전달하려면 바인딩에서이를 수행해야합니다. –

+0

@Zach (그리고 Ian하지만 그는 이것을 알고 있습니다!) 기본 WithConstructorArgument/ConstuctorArgumetn ctor에 과부하가있어 args가 상속받은 것으로 표시되어 원하는대로 생각하는 것처럼 자식 Resolutions에 전파시킵니다. (일반적으로 그것의 잘못된 접근과 혼란을 일으킬 것입니다 그러나 거기에 확실히) –

1

내가 Ninject에 (나는 현재 멀리 내 개발 컴퓨터에서 해요)를 지원하는 경우 잘 모르겠지만, 다른 모든 경우합니다 (Ninject에 실패가 :(되지 않는다

MyType obj = kernel.Get<MyType>(); 
obj.Init("foo","bar"); 
:

class MyType 
{ 
    public class MyType() {} 
    public class MyType(string param1,string param2){Init(param1,param);} 
    public void Init(string param1,param2){...} 
} 

이 그럼 당신은이 작업을 수행 할 수 있습니다 문서는 당신의 문제를 해결하기 위해 생성자에서 초기화를 분리 할 수있다)을 많이 원하는 수 잎3210

완벽하지는 않지만 대부분의 경우 작업을 수행해야합니다.

+0

감사합니다.하지만 불행히도이 매개 변수 없이는 내 개체의 생성자를 호출 할 수 없습니다 ... Ninject 1.x는 작업을 꽤 잘 수행하고 있으며이 기능이 어떻게 변경되었는지 알고 싶습니다. 2.0 버전. – andrecarlucci