使用Ninject + DbContext + Service + MVC的架构:如何将DbContext注入服务?

时间:2014-01-18 21:07:57

标签: service orm architecture dependency-injection inversion-of-control

我有一个Visual Studio解决方案,其中包含以下内容:

  • MyProject.Domain - POCOs。
  • 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项目不应该知道&#34;关于ORM,对吧?为什么这不被认为是糟糕的设计?管理这种依赖的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

如果在MVC project中配置所有依赖项,则需要引用包含实现的项目。

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

我不熟悉Ninject,但是CastleWindsor中的可以在任何地方(在任何程序集中)编写installers ,然后在您的类型注册过程中调用它们MVC project。有一个可能对您有帮助的问题: Convert this Castle Windsor Installer to Ninject to register all repositories

如果您添加一个知道ORM project及其干扰的“安装程序”的项目,则MVC project不会直接引用ORM project。在这种情况下,您的MVC project应该只了解DataAccess图层界面和project with installers