2014-11-20 35 views
0

根据这个answer,我可以将依赖注入到构造函数中。但是,假如我有10个'副主持人'呢?我应该通过构造函数注入所有这些吗?什么是建议的设计模式(工厂方法,外观等)用于这种情况?我很感激你是否可以提供示例代码来使用NUnit和NSubstitute来测试它?提前致谢!如何将多个演示者插入主演讲者?

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

如果您'IPresenter'对象在编译时组成通过'Constructor injection'传递它们,你应该在可能的情况下争取'Constructor injection'。你可以通过你的IoC容器为你的构造函数提供一个'IEnumerable 'T:IPresenter',或者如果你不使用的话,你可以使用穷人DI。 – Unflux 2014-11-21 00:07:14

回答

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); 
相关问题