1

我有了以下的Visual Studio解决方案:使用Ninject + DbContext + Service + MVC的体系结构:如何将DbContext注入服务?

  • MyProject.Domain - 波苏斯。
  • MyProject.Data - ORM(实体框架DbContext)。
  • MyProject.Services - DbContext周围的包装。包含执行业务逻辑的类。
  • MyProject.Web - 使用服务层的MVC应用程序。

对于我的MVC应用程序,我使用Ninject将服务注入到我的MVC控制器中。在我的MVC项目绑定看起来像这样:

kernel.Bind<ISomeService>().To<SomeService>(); 

这部分工作正常。但是,我还想在我的服务中注入IDbContext,而我在网上看到的示例有点令人困惑。我在网上看到的例子看起来使上面的代码看起来是这样的:

kernel.Bind<ISomeService>().To<SomeService>(); 
kernel.Bind<ISomeDbContext>().To<SomeDbContext>(); 

现在,由于SomeDbContext位于MyProject.Data,这意味着我必须在我的MVC项目添加到ORM项目的引用。这有效,但这似乎打败了IoC的目的。 MVC项目不应该“了解”ORM,对吧?为什么这不被认为是糟糕的设计?管理这种依赖的正确方法是什么?

+1

@Steven - 这确实是重复的。你提供的链接回答我的问题(特别是你的回答!)。我正在投票结束。谢谢! – anon

回答

1

如果您在MVC project中配置所有依赖关系,则需要引用可执行的项目。

我对这个解决方案好,如果真的需要避免这种参考,你可以尝试下面的方法。

我不熟悉Ninject,但CastleWindsor就可以写installers任何地方(任何组件内),然后在从MVC project类型注册过程调用它们。有一个SO问题可以帮助你:Convert this Castle Windsor Installer to Ninject to register all repositories

那里,如果你与知道ORM project及其interfeces“安装程序”添加项目将不会从MVC project是dirrect参考ORM project。在这种情况下,您的MVC project只应了解DataAccess层接口和project with installers

相关问题