2012-02-08 125 views
4

我有3个组件Presenter,Business和DataAccess。 Presenter引用Business和Business引用DataAccess。错误构造函数重载模拟

我有一个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类我写了下面这使错误数据访问组件未在演示referened代码。但我不想在Presenter中添加对DataAccess的引用。

VAR custBusiness =新CustomerBusiness(“英语”)

谁能推荐什么是实现这一目标的最佳方式,避免了在演示引用数据访问?

仅当存在两个单参数构造函数时才会出现此错误。 错误去的方式时,我有以下构造函数:

 public CustomerBusiness(ICustomerDataAccess data, string language) 
     { 
     _data = data; 
     } 

     public CustomerBusiness(string language): this(new CustomerDataAccess("language")) 
    {} 

回答

2

我建议你将你的接口定义成合同组件,让您的实现使用IoC容器(如Unity注入在运行时,但也有很多选择从)。

这将打破'实现'程序集之间的编译时间依赖关系,并且不需要创建单独的构造函数来传递模拟。

E.G.

Presentation refs >> IBusiness(Consumes) 
Business  refs >> IBusiness(Implements), IDataAccess(Consumes) 
IDataAccess refs >> IDataAccess(Implements) 
2

谁能推荐什么是实现这一目标的最佳方式,避免 Presenter中引用数据访问?

我建议要么使用IoC容器或起泡的依赖一路攀升到你的应用程序的根......

你是对的 - 你不是主持人应该知道你的数据访问类。但是,您遇到问题的水域是让您的“客户业务”知道并负责实例化数据访问类。你用来进行测试的第一个构造函数非常好 - 这是你应该拥有的只有

然后,您应该让您的Presenter类在其构造函数中创建一个“CustomerBusiness”对象。然后,它可以在不知道如何实例化或如何实例化数据访问对象,甚至是数据访问对象的存在的情况下使用CustomerBusiness。