我刚刚从演示者类中重构了一个新的域类,但我不知道在哪里实例化它。

这是对维护不善的遗留项目进行的更大的持续重构工作的一部分。

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

视图本质上是一种谦虚的形式,完全取决于演示者的一切。

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

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

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

我愿意接受任何建议。

有帮助吗?

解决方案 2

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

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;
}

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

其他提示

我已经做好了!!!看看这里 我的存储库. 。我这里的选择是使用构造函数......满足最贪婪的人我确信主持人是Up。在您的情况下,您可以从视图中提供依赖项的特定实现。

玩得开心 :)

我现在会选择存储库或工厂。它将立即可以测试。将来,您可以将其实现替换为 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();
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top