【问题标题】:Architecture using Ninject+DbContext+Service+MVC: How to inject DbContext into Service? [duplicate]使用 Ninject+DbContext+Service+MVC 的架构:如何将 DbContext 注入 Service? [复制]
【发布时间】:2014-01-18 21:07:57
【问题描述】:

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

  • MyProject.Domain - POCO。
  • 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,对吧?为什么这不被认为是糟糕的设计?管理这种依赖关系的正确方法是什么?

【问题讨论】:

  • @Steven - 这确实是重复的。您提供的链接回答了我的问题(尤其是您的回答!)。我投票结束。谢谢!

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


【解决方案1】:

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

我对这个解决方案没问题,如果确实需要避免这种引用,您可以尝试以下方法。

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

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

【讨论】:

    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多