首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多个presenter注入到主presenter中?

如何将多个presenter注入到主presenter中?
EN

Stack Overflow用户
提问于 2014-11-21 06:12:07
回答 1查看 146关注 0票数 0

根据这个answer,我可以向构造函数注入依赖项。但是,假设我有10个“子主持人”呢?我是不是应该通过构造函数注入所有这些函数?对于这种情况,推荐使用哪种设计模式(工厂方法、外观等)?如果您能给出使用NUnit和NSubstitute测试它的示例代码,我将非常感谢?提前感谢!

代码语言:javascript
复制
public void PresenterMain(IViewMain view
, IServiceMain service
, IAddNewJobPresenter addNewJobPresenter
, IClientManagementPresenter clientManagementPresenter
, IJobBatchesPresenter jobBatchesPresenter
, IReportsPresenter reportPresenter...etc)
EN

回答 1

Stack Overflow用户

发布于 2014-11-26 09:40:17

考虑到您的用户需要使用presenter的10个实例,有几个选项。以下是设置场景的一些基本框架:

代码语言:javascript
复制
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,在其中您可以在列表中对演示者进行排序。

代码语言:javascript
复制
public class Presenter1 : IPresenter
{
    public void Present()
    {
        // Do something here
    }
}

public class Presenter2 : IPresenter
{
    public void Present()
    {
        // Do something here
    }
}

public class Presenter3 : IPresenter
{
    public void Present()
    {
        // Do something here
    }
}

public class CompositePresenter : IPresenter
{
    private readonly IPresenter[] presenters;

    public CompositePresenter(IPresenter[] presenters)
    {
        if (presenters == null)
            throw new ArgumentNullException("presenters");
        this.presenters = presenters;
    }

    public void Present()
    {
        // Do nothing except delegate the call to the nested
        // instances. You may need to do some extra work to deal
        // with multiple return values, like add up the values
        // or decide which value works best for the scenario.
        foreach (var presenter in this.presenters)
        {
            presenter.Present();
        }
    }
}

然后将其连接起来,如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
    }
}

然后将其连接起来,如下所示:

代码语言:javascript
复制
var nullPresenter = new NullPresenter();
var presenter3 = new Presenter3(nullPresenter);
var presenter2 = new Presenter2(presenter3);
var presenter1 = new Presenter1(presenter2);

var consumer = new SomeConsumer(presenter1);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27050565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档