我已经阅读了很多关于DI和autofac的示例代码。我注意到的一件事是,许多人在同一项目中捆绑了接口和实现。从设计的角度来看,我认为这是不正确的,所有接口都应单独组装。所以我这样定义我的项目:
UI - Web App/Windows App/Both
- Views
- Models
- Controllers/ ViewModels
Business
- Services/Processes
- Interfaces
- Model
DataAccess
- Repositories & UoW
- Interfaces
- Model
这样,我的业务服务仅引用DataAccess接口和模型,而与实际实现无关。同样,UI也仅指业务接口和模型,并且存在明显的分离。这也有助于我测试可以独立测试图层的地方。
我的问题是有关Autofac模块的声明。我需要设置构建以将实现复制到最终部署目录中。我的业务模块需要引用数据访问实现,而UI需要访问业务模块。
我正在考虑Autofac的程序集扫描,但不确定这是否是唯一的选择。还要注意,我已经遵循了命名约定,并且在大多数情况下,我不会编写单独的绑定。 我在这里担心的是
答案 0 :(得分:1)
我的观点是,在单独的程序集中具有接口和实现会超出它的范围,并且无法提供价值,因为您必须部署两个程序集才能使项目正常工作。我喜欢参考Paul Stovell的this tweet,他指出命名空间是关注的单元,而程序集是部署的单元。我发现这引起了我的共鸣。
回到您的问题:最终,您的可执行项目(Web应用程序或Windows应用程序)需要知道接口和实现。
我的意见是Autofac模块应该存在于顶层项目中,因此应该引用所有必要的项目。我这样做的理由是,除了定义服务注册之外,您还将定义每个服务的生存期。这个概念取决于使用您的依赖项的项目。一个Web项目可能每个HTTP请求都会注册一些服务,而Windows应用程序的生存期可能会有所不同。
对我来说,模块非常适合将注册分组在一起,但这并不意味着它们与所包含的注册服务都必须位于同一个项目中。