2014-11-20 4 views
0

answer에 따르면, 나는 생성자에 의존성을 삽입 할 수 있습니다. 그러나 10 명의 '하위 발표자'가 있다고 가정 해 봅시다. 모든 것을 생성자를 통해 주입해야합니까? 이 상황에서 사용할 권장 설계 패턴 (공장 방법, 정면 등)은 무엇입니까? NUnit과 NSubstitute를 사용하여 테스트하기 위해 샘플 코드를 제공 할 수 있다면 고맙겠습니다. 미리 감사드립니다!주 발표자에 여러 발표자를 주입하는 방법은 무엇입니까?

public void PresenterMain(IViewMain view 
, IServiceMain service 
, IAddNewJobPresenter addNewJobPresenter 
, IClientManagementPresenter clientManagementPresenter 
, IJobBatchesPresenter jobBatchesPresenter 
, IReportsPresenter reportPresenter...etc) 
+1

당신의 'IPresenter' 객체는 컴파일 시간 th에서 작성됩니다. 가능하다면'Constructor injection'을 위해 노력해야합니다. 생성자에게 IEnumerable (여기서 T : IPresenter')을 제공 할 수 있습니다. IoC 컨테이너를 사용하거나 가난한 사람 DI는 사용하지 않을 것입니다. – Unflux

답변

1

소비자가 발표자 10 인스 턴스를 사용해야하는 경우 몇 가지 옵션이 있습니다.

public interface IPresenter 
{ 
    void Present(); 
} 

public interface IConsumer 
{ 
    void DoSomething(); 
} 

public class SomeConsumer : IConsumer 
{ 
    private readonly IPresenter presenter; 

    public SomeConsumer(IPresenter presenter) 
    { 
     if (presenter == null) 
      throw new ArgumentNullException("presenter"); 
     this.presenter = presenter; 
    } 

    public void DoSomething() 
    { 
     this.presenter.Present(); 
    } 
} 

당신은 다음 목록에서 발표자를 주문할 수있는 composite pattern을 사용할 수 있습니다 여기에 시나리오를 설정하는 몇 가지 기본적인 프레임 워크입니다. 다음

그리고처럼 철사 :

var presenter1 = new Presenter1(); 
var presenter2 = new Presenter2(); 
var presenter3 = new Presenter3(); 
var compositePresenter = new CompositePresenter(new IPresenter[] { 
    presenter1, 
    presenter2, 
    presenter3 
}); 

var consumer = new SomeConsumer(compositePresenter); 

또는 당신은 decorator pattern 사용할 수 있습니다

public class Presenter1 : IPresenter 
{ 
    public Presenter1(IPresenter innerPresenter) 
    { 
     if (innerPresenter == null) 
      throw new ArgumentNullException("innerPresenter"); 
     this.innerPresenter = innerPresenter; 
    } 

    public void Present() 
    { 
     // Do something here 

     // You could make this call conditional 
     this.innerPresenter.Present(); 

     // Or do something here 
    } 
} 

public class Presenter2 : IPresenter 
{ 
    public Presenter2(IPresenter innerPresenter) 
    { 
     if (innerPresenter == null) 
      throw new ArgumentNullException("innerPresenter"); 
     this.innerPresenter = innerPresenter; 
    } 

    public void Present() 
    { 
     // Do something here 

     // You could make this call conditional 
     this.innerPresenter.Present(); 

     // Or do something here 
    } 
} 

public class Presenter3 : IPresenter 
{ 
    public Presenter3(IPresenter innerPresenter) 
    { 
     if (innerPresenter == null) 
      throw new ArgumentNullException("innerPresenter"); 
     this.innerPresenter = innerPresenter; 
    } 

    public void Present() 
    { 
     // Do something here 

     // You could make this call conditional 
     this.innerPresenter.Present(); 

     // Or do something here 
    } 
} 

public class NullPresenter : IPresenter 
{ 
    public void Present() 
    { 
     // Do nothing here - this class is a placeholder 
     // in case you want to expand the design later 
    } 
} 

을 그리고처럼 철사 : 경우

var nullPresenter = new NullPresenter(); 
var presenter3 = new Presenter3(nullPresenter); 
var presenter2 = new Presenter2(presenter3); 
var presenter1 = new Presenter1(presenter2); 

var consumer = new SomeConsumer(presenter1); 
관련 문제