我目前正试图将DDD模式与依赖注入“结合”(使用Ninject),但我觉得我这样做违反了基本原则。
我有一个控制台应用程序,它在OWIN之上托管NancyFX Web框架以提供配置界面。我的项目结构如下:
Infrastructure
- Infrastructure.Core
- Repositories
- Mappings
- Infrastructure.Media
- Media Services
Core
- Logging & Exception-Handling intercaces
Domain
- Entities
- Repositories
- Services
App
- Main application
Web
- Web Frontend (Nancy Modules, Models etc.)
因为我在所有地方DIying(嘿......)(将上下文注入存储库,解析单例服务......),我在 App 项目中创建了一个静态类这将创建一个IKernel实例并在应用程序启动时注册所有依赖项。
我有一些将在Nancy Modules和自托管Web API控制器中访问的存储库,现在我遇到的第一个问题是当我想在'per request'生命周期中注册存储库时:IKernel.Bind( ).PerRequest()仅在Ninject.Web.Common包中可用,它依赖于Microsoft.Web.Infrastructure等等。我最终在组件中创建对特定于Web的包的依赖关系,基本上对我一无所知Web框架或API(配置OWIN除外)。
此外,通过绑定域名存储库&服务接口来自基础设施层的具体实现,我根据实现做了我的应用程序,这感觉并不是真的。
我怎样才能解决这些问题?
答案 0 :(得分:2)
您听说过Composition Root吗?您只能在最顶层的项目(例如Web应用程序)中将内容注册到特定实现。你在其他任何地方对接口进行编码。
听起来你已经自己发明了这个并且我不能真正感受到这个问题 - 因为这是引用所有内容的最顶级项目,包括web,owins,ninjects等,这里真的应该没有问题。
我的建议是永远不要使用单身人士。相反,有工厂或本地依赖性解析器。解析器是本地基础结构的一部分,用作在隔离子系统中创建服务的中心。解析器可以安全地被其周围环境使用,它没有引用任何东西,但它有一个可配置的提供程序,它再次在Composition Root中设置。
这样,如果解析器使用特定的实现甚至是特定的DI容器,那么它就会在最顶层的项目中设置。