DDD存储库

时间:2009-09-01 10:17:09

标签: c# domain-driven-design repository-pattern

创建存储库类时,例如。 CustomerRepository,我的方法应该是静态的吗?

或者我应该首先实例化CustomerRepository类,然后调用实例上的公共方法?

哪种方法最好,为什么?

由于

4 个答案:

答案 0 :(得分:12)

我只使用instance进行单元测试 - 例如使用static方法进行模拟很难。

Static方法为death to testability.

答案 1 :(得分:3)

我总是创建一个描述我的存储库合同的界面。 因此,我不会走静态成员的路线 不仅是因为已经提到的可测试性,而且因为我的存储库需要有一个“上下文”。
更具体地说,我使用NHibernate作为OR / M映射器,并将应该使用的ISession传递给存储库实例。通过这样做,多个存储库可以使用相同的ISession(UnitOfWork),因此,可以在同一事务中保留多个不同类型。

答案 2 :(得分:1)

您应该可以创建一个接口ICustomerRepository,然后创建一个派生自该接口的CustomerRepository类。

原因是可测试性。

在测试中,您现在可以使用一些模拟对象模拟CustomerRepositotory的具体实例。

您还可以轻松替换此存储库的实现,添加日志记录或缓存。

至于静力学。如果你想使用静态实例,最好使用一些依赖注入工具并将组件的生活方式设置为单例。它仍然是可以测试的。

答案 3 :(得分:-4)

静态很难测试,但与此同时,静态调用更加简单,一切都可以归结为一种方法,而不是启动存储库并调用其方法和关闭存储库。有各种方法可以实现它,我们发现以下方法是最好的,因为你不能覆盖静态方法所以将来如果你想继承和扩展功能,那就有点难了。

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

CustomerRepository.Repository.GetAll();

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

class CustomerRepository{

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

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

}