我有3个程序集Presenter,Business和DataAccess。演示者引用引用DataAccess的业务和业务。
我在Business Assembly中有一个CustomerBusiness类,有2个单参数构造函数。第一个构造函数仅用于测试以模拟数据访问对象。 DataAccess程序集中的ICustomerDataAccess。
class CustomerBusiness()
{
private ICustomerDataAccess _data= null;
public CustomerBusiness(ICustomerDataAccess data)
{
_data = data;
}
public CustomerBusiness(string language): this(new CustomerDataAccess("language"))
{}
public void SomeOtherMethods()
{
...
}
}
在CustomerPresenter类中,我编写了下面的代码,该代码给出了在Presenter中不引用DataAccess程序集的错误。但我不想在Presenter中添加对DataAccess的引用。
var custBusiness = new CustomerBusiness(“english”)
有人可以推荐实现此目的的最佳方法,避免在Presenter中引用DataAccess吗?
仅当存在两个单个参数构造函数时才会发生错误。 当我有下面的构造函数时,错误就会出现:
public CustomerBusiness(ICustomerDataAccess data, string language)
{
_data = data;
}
public CustomerBusiness(string language): this(new CustomerDataAccess("language"))
{}
答案 0 :(得分:2)
我建议您将接口定义移动到合同程序集中,并使用IOC容器(例如Unity)在运行时注入实现,但有很多可供选择。
这将打破'implementation'程序集之间的编译时依赖性,并且无需创建单独的构造函数来传递模拟。
E.G。
Presentation refs >> IBusiness(Consumes)
Business refs >> IBusiness(Implements), IDataAccess(Consumes)
IDataAccess refs >> IDataAccess(Implements)
答案 1 :(得分:2)
任何人都可以推荐实现此目的的最佳方法,避免 在Presenter中引用DataAccess?
我建议使用IoC容器或将依赖项一直冒泡到应用程序根目录...
你是对的 - 你的演示者不应该知道你的数据访问类。但是,如果您遇到问题,那么让您的“CustomerBusiness”了解并负责实例化数据访问类。你用于测试的第一个构造函数很棒 - 它只是你应该拥有的 。
然后,您应该让Presenter类在其构造函数中使用“CustomerBusiness”对象。然后,它可以使用CustomerBusiness而不知道如何实例化它或如何实例化数据访问对象,甚至是数据访问对象的存在。