C# IOC和接口
我的项目结构如下:-C# IOC和接口,c#,c#-4.0,dependency-injection,inversion-of-control,C#,C# 4.0,Dependency Injection,Inversion Of Control,我的项目结构如下:- CentralRepository.BL CentralRepository.BO CentralRepository.DataAccess CentralRepository.Tests CentralRepository.Webservices 这两者之间存在着大量的依赖关系。我想利用unity来减少依赖性,所以我将为我的类创建接口。我的问题是接口应该驻留在哪个项目中。我的想法是它们应该在BO层。有人能给我一些指导吗?BO本质上是你的域对象,或者至少这是我的假设。通常
CentralRepository.BL
CentralRepository.BO
CentralRepository.DataAccess
CentralRepository.Tests
CentralRepository.Webservices
这两者之间存在着大量的依赖关系。我想利用unity来减少依赖性,所以我将为我的类创建接口。我的问题是接口应该驻留在哪个项目中。我的想法是它们应该在BO层。有人能给我一些指导吗?BO本质上是你的域对象,或者至少这是我的假设。通常,除非您使用类似ActiveRecord的模式,否则它们只是状态对象。另一方面,接口指定行为。从许多“最佳实践”来看,将行为和状态混为一谈不是一个好概念。现在我可能会漫谈一下,但我认为背景可能会有所帮助 现在,我们来讨论接口应该存在于何处的问题。有两种选择
希望这段漫无边际的谈话能有所帮助 如果你说的是程序集,我建议在大多数情况下,在实现者所在的位置保留接口 就我个人而言,当我使用分层方法时,我倾向于为每个层提供自己的组件,并为其下面的层提供一个引用。在每一层中,大多数公共事物都是接口。因此,在数据访问层中,我可以使用icCustomerDAO和IOrderDao作为公共接口。我还将在Dao组装中拥有公共Dao工厂。然后,我将把实现公共接口的特定实现标记为internal--CustomerDaoMySqlImpl或customerdaomxmlimpl。然后,公共工厂向用户(即域层)提供实现,而用户不知道他们得到的是哪一个实现——他们向工厂提供信息,工厂转身递给他们一个他们使用的ICCustomerDAO
我之所以提到这一切,是为了理解接口应该是什么样的基础——API的服务和客户端之间的契约。因此,从依赖关系的角度来看,您希望在服务者所在的位置定义契约。如果您在其他地方定义它,那么您可能不会真正使用接口管理依赖关系,而只是引入了一个无用的间接层
所以无论如何,我要说的是,把你的接口想象成它们是什么——一份关于你将要提供什么的合同,同时对你将如何提供它的细节保密。这可能是一个很好的启发,可以让界面放置在更直观的位置。在组合层次上,您有三个选择:
- 在单独的库中定义接口
- 与用户一起定义接口
- 定义接口及其实现者