如何在Passive View体系结构中为Presenter类创建依赖项创建?

时间:2009-05-11 19:14:42

标签: c# refactoring dependency-injection mvp

我刚从演示者类重构了一个新的域类,但我无法弄清楚在哪里实例化它。

这是一项较大规模的持续重构工作的一部分,其中遗留项目维护不善。

Presenter当前正由视图的OnLoad事件创建,视图作为构造函数中的参数传递。演示者中的所有公共方法都是无参数的,并返回void。它们使用视图的公共属性与视图进行通信。

视图本质上是一种不起眼的形式完全取决于演示者的所有内容。

这是典型的被动视图模式,我想继续坚持它。这让我陷入困境。我需要为演示者创建一个新域对象的实例。

  • 如果我通过构造函数传递它,那么视图必须创建它并获得不必要的依赖。
  • 如果我在演示者的任何地方创建它,我不能在单元测试中用模拟对象替换它。
  • 如果我将它作为演示者的公共属性,那么我会在使用它的演示者方法中引入创建顺序依赖,但我仍然没有解决外部类对创建它的责任。

我目前没有使用任何依赖注入框架。虽然我对将来使用它感兴趣但源代码仍然非常脆弱,无法引入第三方框架。

我愿意接受任何建议。

3 个答案:

答案 0 :(得分:2)

我已经完成了!!! 在my repository查看此处。我在这里的选择是使用构造函数......满足最贪婪的我确信演示者是Up。在您的情况下,您可以从视图特定的impl提供依赖项。

玩得开心:)

答案 1 :(得分:1)

我找到了一个更简单的解决方案。这是我原来课程的一个例子:

public Presenter(IView view)
{
    this.View = view;
}

我想将新的依赖项作为构造函数参数传递,但也不想将此依赖项添加到我的视图中。建设者链接救援!

public Presenter(IView view):this(view, new Dependency()){}

public Presenter(IView view, IDependency dependency)
{
    this.View = view;
    this.Dependency = dependency;
}

现在,生产代码继续使用原始界面,而单元测试使用传递模拟的新视图和依赖项。如果依赖关系的数量继续增长,则需要进行一些重构,但在不久的将来,这是一个理想的解决方案。

答案 2 :(得分:0)

我现在要去仓库或工厂。它会立即测试。将来,您可以将其实现替换为DI库。

public class DomainObjectsRepository
{
    /// <summary>
    /// can not be instantiated, use <see cref="Instance"/> instead.
    /// </summary>
    protected DomainObjectsRepository()
    {

    }

    static DomainObjectsRepository()
    {
        Instance = new DomainObjectsRepository();
    }

    public static DomainObjectsRepository Instance { get; set; }


    public virtual ICustomerDao GetCustomerDao()
    {
        return new CustomerDao();
    }
}

public class DomainObjectsRepositoryMock : DomainObjectsRepository
{
    public override ICustomerDao GetCustomerDao()
    {
        return new CustomerDaoMock();
    }
}