2017-04-23 1 views
0

Ninject 프레임 워크에서 IoC를 사용하도록 일부 코드를 리팩토링하려고합니다. 지금까지 나는 전달할 생성자 매개 변수가없는 시나리오에서 클래스에 성공적으로 삽입 할 수있었습니다. 그러나 매개 변수를 전달할 때 어려움이 있습니다. 이것은 아래의 바인딩 클래스에서 세 번째 바인딩입니다. 클래스Ninject를 사용하여 생성자 매개 변수로 새 객체 인스턴스화

public class Bindings : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<ILogger>().To<Logger>(); 
      Bind<IPlayerDatadao>().To<PlayerDatadao>(); 
      Bind<IPlayerScores>().To<PlayerScores>(); 
     } 
    } 

로거 클래스 바인딩

는 매개 변수가없는 생성자를 가지고 있으며, Ninject에 전송하면 잘 작동합니다.

성공은

// IoC creation 
    var kernel = new StandardKernel(); 
    kernel.Load(Assembly.GetExecutingAssembly()); 

    //Log User details 
    var logger = kernel.Get<ILogger>(); 
    logger.LogVisitorDetails(); 

하지만, 내 시도는 아래의 예외

실패

 string priceString = Foo(); 
     string pointsString = Bar(); 

     return kernel.Get<IPlayerScores>(new[] { new ConstructorArgument("pointsString", pointsString), new ConstructorArgument("points", priceString) }); 

이 생성자를 가진 클래스를 던졌다.

클래스

public class PlayerScores : IPlayerScores 
{ 
    [Inject] 
    public string points { get; set; } 
    [Inject] 
    public string price { get; set; } 
    public PlayerScores(string Points, string Price) 
    { 
     points = Points; 
     price = Price; 
    } 
} 

난 정말 내가 바인딩 클래스 나 정말이야 주입

+2

'PlayerScores'는 구성 요소 (동작이있는 클래스)처럼 보이지 않습니다. 데이터 컨테이너입니다. 이러한 종류의 객체 (DTO 뷰 모델, 메시지, 엔티티)는 DI 컨테이너에 의해 생성되어서는 안됩니다. 또한 PlayerScopes가 (그 이름이 암시하지 않는) 구성 요소 일지라도 [런타임 데이터가 삽입되지 않아야합니다] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php ? id = 99). – Steven

답변

0

의 시점에서 하나의 매개 변수를 처리 할 방법을 잘 모르겠어요 주입 바인딩 클래스 나 주입 지점에서 매개 변수를 처리하는 방법을 잘 모르겠다.

바인딩시. 커널

public class PlayerScores : IPlayerScores 
{ 
    public PlayerScores(string points, string price) 
    { 
     this.Points = points; 
     this.Price = price; 
    } 

    public string Points { get; set; } 
    public string Price { get; set; } 
} 

을 다음 구성 :

Bind<IPlayerScores>() 
    .To<PlayerScores>() 
    .WithConstructorArgument("points", "some points") 
    .WithConstructorArgument("price", "some price"); 

또는 그것을 매개 변수 이름과 마법의 문자열을 피할 수로 조금 더 친절 리팩토링이다 ToMethod를 사용하여 당신은 모델에서 모든 Ninject에 종속성을 제거해야합니다 :

Bind<IPlayerScores>() 
    .ToMethod(ctx => new PlayerScores("some points", "some price")); 

2 매개 변수가 너무 휘발성이어서 각 호출마다 다른 값이 필요할 경우, 그것들을 생성자 매개 변수로 전달하지만 런타임에 클래스에서 호출 할 인스턴스 메소드의 매개 변수로 전달할 수 없습니다.

+0

나는 그 두 가지를 모두 시도했지만 결국 문자열 리터럴 "일부 포인트"를 생성자에 전달하게되고, 전달하려는 동적 값이 전달됩니다. – Sperick

+2

예, 예상 한 것입니다. 제 대답의 핵심은 생성자 인수 바인드시 커널을 구성 할 때 알려야합니다. 이것이 사실이 아니라면, 내 대답의 마지막 부분 인 마지막 단락을보십시오. –

관련 문제