DDD存储库

3
当创建一个仓库类时,例如CustomerRepository,我的方法应该是静态的吗?
还是我应该首先实例化CustomerRepository类,然后在实例上调用公共方法?
哪种方法最好,为什么?
谢谢
4个回答

12

针对单元测试,我会选择使用一个实例(instance),因为静态(static)方法对于模拟(mocking)来说相对困难。

静态(static)方法会导致测试的可测试性受到极大的影响,因此应该尽可能避免使用。


3
我总是创建一个描述存储库契约的接口。 因此,我不会使用静态成员。
这不仅是为了可测试性,而且还因为我的存储库需要有一个“上下文”(context)
更具体地说,我使用NHibernate作为OR/M映射器,并将应该用于存储库实例的ISession传递给它。通过这样做,多个存储库可以使用相同的ISession(UnitOfWork),因此,可以在同一事务中持久化多种不同类型的内容。

1
你应该创建一个名为ICustomerRepository的接口,然后再创建一个从该接口继承的名为CustomerRepository的类。
原因是为了测试性。
在测试中,你现在可以使用一些模拟对象(mock object)替换掉CustomerRepository的具体实例。
你还可以轻松地替换此存储库的实现,添加日志记录或缓存。
至于静态代码。如果想使用静态实例,最好使用某些依赖注入工具,并将组件的生命周期设置为单例。它仍然是可测试的。

-4

静态方法很难测试,但同时也更容易调用,所有操作都可以在一个方法中完成,而不是启动存储库、调用其方法和关闭存储库。有多种实现方式,我们发现以下方式最好,因为您无法覆盖静态方法,因此如果将来想要继承和扩展功能,这会有一点困难。

我们另一种方法是,我们具有实例方法,但我们有一个静态变量..例如...

CustomerRepository.Repository.GetAll();

这就是它的实现方式...

class CustomerRepository{

    // Only one static variable    
    public static CustomerRepository Repository = new CustomerRepository();

    // all methods are instance methods..
    public IEnumerable GetAll(){
    ...
    }

}

new Instance().DoSomething() 的调用和 Instance().DoSomething() 一样容易。然而,我采用了类似的方法,将实例方法包装在静态类中,以便将其用作静态方法,但具有切换实例类的好处。我倾向于将此保留给我无法操作的第三方类。 - Finglas
但是我考虑到新操作符的开销,每次仅为调用方法而创建和销毁对象并不好。实际上,许多编程设计都谈论“池化”,这意味着重用对象而不是创建和销毁,因为两种方法都需要更多的簿记操作,并且使 CPU 忙碌,还会增加对象堆大小。 - Akash Kava
不要担心“new”开销,除非它成为问题。过早优化什么的... - Finglas
不要担心,直到它成为问题。这样的事情永远不会成为问题,你甚至没有意识到它们是实际问题。正确使用资源(CPU/人力/电力/内存)应该是IT人才的首要伦理。问题问及最佳方式。最佳方式是避免问题,而不是等待它变成问题。 - Akash Kava
正确使用资源(CPU / 人力 / 动力 / 内存)应该是 IT 人才的首要伦理。同意。这就是为什么优先考虑可测试性或多线程环境下的使用能力,而不是创建新对象的运行时成本。 - quentin-starin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接