C# DDD存储库

C# DDD存储库,c#,domain-driven-design,repository-pattern,C#,Domain Driven Design,Repository Pattern,在创建存储库类(例如CustomerRepository)时,我的方法应该是静态的吗 或者我应该首先实例化CustomerRepository类,然后调用实例上的公共方法吗 哪种方法最好,为什么 谢谢我会选择一个实例来进行单元测试——例如,使用静态方法很难进行模拟 静态方法是静态很难测试,但同时,静态更容易调用,一切都可以归结为一个方法,而不是启动存储库并调用其方法和关闭存储库。有各种各样的方法来实现它,我们发现下面的方法是最好的,因为您不能重写静态方法,所以在将来,如果您想要继承和扩展功能,它

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

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

哪种方法最好,为什么


谢谢

我会选择一个
实例
来进行单元测试——例如,使用
静态
方法很难进行模拟


静态
方法是

静态很难测试,但同时,静态更容易调用,一切都可以归结为一个方法,而不是启动存储库并调用其方法和关闭存储库。有各种各样的方法来实现它,我们发现下面的方法是最好的,因为您不能重写静态方法,所以在将来,如果您想要继承和扩展功能,它有点困难

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

CustomerRepository.Repository.GetAll();
这就是它的实现方式

class CustomerRepository{

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

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

}

我总是为我的存储库创建一个描述契约的界面。 因此,我不走静态成员的路线。
不仅是因为已经提到的可测试性,还因为我的存储库需要一个“上下文”。

更具体地说,我使用NHibernate作为OR/M映射器,并将应该使用的ISession传递给存储库实例。通过这样做,多个存储库可以使用相同的ISession(UnitOfWork),因此,可以在同一事务中持久化多个不同的类型。

您应该创建一个接口ICCustomerRepository,然后创建一个从该接口派生的类CustomerRepository

原因是可测试性

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

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


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

new Instance().DoSomething()与Instance().DoSomething()一样容易调用。但是,我使用了一种类似的方法,将实例方法包装在一个静态类中,该静态类可以用作静态方法,但可以切换实例类。我倾向于保留这第三个不能接触的类,但是我考虑新的操作员开销,每次创建和销毁对象只是调用一个方法是不好的,事实上很多编程设计谈论“汇集”,这意味着重用对象而不是创建和破坏。因为这两种方法都需要更多的簿记操作,使CPU繁忙,并增加对象堆大小。在出现问题之前,不要担心“新”开销。过早的优化等等…别担心??直到它成为一个问题?这样的事情永远不会成为问题,你甚至从来没有意识到它们是真正的问题。正确使用资源(cpu/人力/电源/内存)应该是IT人才的首要道德准则。这个问题问的是最好的方法。最好的方法是避免问题,而不是等到问题出现时再去做。正确使用资源(cpu/人力/电源/内存)应该是it人才的首要道德准则。这就是为什么对可测试性或在多线程环境中使用的能力进行优先级排序时,应该优先考虑新建对象的运行时成本。