创建存储库类时,例如。 CustomerRepository,我的方法应该是静态的吗?
或者我应该首先实例化CustomerRepository类,然后调用实例上的公共方法?
哪种方法最好,为什么?
由于
答案 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(){
...
}
}