设计

我有至少2个其他类使用的存储库类。 此存储库类需要初始化 - 成本高(查询数据库)。 现在,我在任何需要的地方创建独立的资源库实例。 问题是,每次创建存储库时都必须进行初始化。 如何设计这样的存储库以便TDD友好? 我脑海中的第一件事是辛格尔顿,但它不是解决方案。


你使用任何类型的IOC容器吗? Unity是我选择的容器,它包含一个ContainerControledLifetimeManager,它使您的类成为单例,但不是由您自己管理。


我希望通过TDD友好的你的意思是'可测试'的代码。 对于Singleton ObjectX,我认为最常见的方法是将“控制创建” 的责任 (SRP) 分割为另一个类,以便ObjectX完成它应该完成的所有工作。

然后你有另一个类ObjectXFactory或Host,或者你想调用它的任何东西,它负责为所有客户端提供一个实例(并在需要时提供线程同步等等)

  • 对象X可以独立TDDed。 您可以在测试用例和测试功能中创建一个新实例。
  • 另一方面,ObjectXFactory也很容易测试..你只需要看看是否有多个GetInstance()调用返回同一个对象。 或者更好地将这个责任委托给像Spring这样的IOC框架,它允许你声明性地标记一个对象定义来获得单例行为(节省你编写测试的工作量)
  • 您只需要教导并遵守Team规范,即不要调用ObjectX构造函数 - 始终使用ObjectXFactory.CreateInstance()。 (如果您发现自己有意识/纪律问题,请将ObjectX的ctor标记为internal,并且只能通过偷偷摸摸的InternalsVisibleToAttribute向测试程序集显示)HTH


    TDD部分的一个答案是学习嘲笑。

    查看Stephen Walther撰写的这篇优秀文章:

    http://stephenwalther.com/blog/archive/2008/03/23/tdd-introduction-to-rhino-mocks.aspx

    链接地址: http://www.djcxy.com/p/78793.html

    上一篇: design

    下一篇: Singleton instance as static field vs. static variable in getInstance() method