我正在尝试清理我的代码以使其可以进行单元测试。我知道必须在编码时创建单元测试但是......我现在必须完成它,代码已经完成。
我的业务类中充满了类似实现的方法,如:
var rep=new NHrepository<ModelClass1>(Session);
rep.Where(x=>x.Field1==1).ToList();
第一个错误(从我的角度来看)是我不必使用“new”而是使用DI并在ctor参数中添加一个INHrepository modelClass1Repository。
如果在我班上我有两个或更多不同型号的存储库?每个人都必须在ctor?或者业务类可能不是用SeparationOfConcern原则构建的?
答案 0 :(得分:1)
你对依赖注入是正确的。
此外,如果您打算为遗留代码编写单元测试,我强烈建议您阅读Working Effectively with Legacy Code。
答案 1 :(得分:1)
一种广泛使用的方法是将n个存储库作为您已经怀疑的构造函数的参数
另一种常用方法是使用依赖注入框架,例如Ninject。这允许您编写如下内容:
[Inject]
public IAbstractRepository<Company> companiesRepository { get; private set; }
[Inject]
public IAbstractRepository<User> usersRepository { get; private set; }
然后,您可以让Ninject根据使用场景注入适当的接口实现(例如,用于测试的虚假存储库或用于生产的真实存储库)
答案 2 :(得分:0)
您的业务类应该有一个带有2个参数的构造函数,每个存储库对应一个参数。您的企业应该公开2个接口,您的持久性应该提供他们的实现。