DI容器2层

时间:2016-01-26 23:16:43

标签: c# asp.net-web-api dependency-injection architecture

我尝试使用像Ninject这样的IoC来设计WebApi应用程序。我有以下几层(3个项目):

  • 域(存储库)层
  • 服务
  • Web API应用程序核心

Repository层具有接口IRepository<T>及其一些实现。并且在服务中还存在具有两种不同实现的接口IService<T>

如果我在WebApi项目中使用DI容器(Ninject)绑定IService<T>ServiceConcrete<T>以及服务项目中的DI容器来绑定IRepository<T>和{{1>,请告诉我吗? }}?

或者我应该在WebAppi项目中只使用一个DI?

2 个答案:

答案 0 :(得分:15)

我发现设置Ninject模块的实用方法可以在下面找到。

概述

  1. 创建名为DependencyResolution
  2. 的程序集
  3. 创建Ninject模块(您将在WebAPI项目中使用)
  4. 只在WebAPI项目中引用此DependencyResolution和您的域项目
  5. NinjectWebCommon.cs
  6. 中初始化/注册您的模块

    详细信息

    1. 应该很容易create a project,例如从NuGet添加Ninject作为参考。
    2. 将新类文件添加到此项目中,该项目以您要创建的模块命名,如:ServiceModule.csRepositoryModule.cs等。 创建您的Ninject module(s)。有关详细说明,请参阅我的answer
    3. 在您的WebAPI项目中,添加对刚刚创建的DependencyResolution项目和域项目的引用。
    4. 在WebAPI项目NinjectWebCommon.cs中初始化/注册刚刚创建的模块:

      private static void RegisterServices(IKernel kernel)
      {
          var modules = new List<INinjectModule>
          {
              new ServiceModule(),
              new RepositoryModule()
          };
      
          kernel.Load(modules);
      }  
      
    5. 我还将尝试解决另一个与您的问题相关的松散问题。我认为您当前的分层设置需要稍微改变。

      你的图层的基本问题和可能是我最大的问题是你混淆了,因此紧密结合了Domain和Repository,这显然是一个基础设施问题

      我建议将图层重新设计为:

      • 服务
      • 基础设施(存储库实施可以在这里进行)
      • 依赖性解决方案
      • 的WebAPI

      不要忘记,您的域层基础架构详细信息(如存储库)有任何了解,否则您将把您的域与不需要的实现细节紧密结合。 / p>

      编辑:根据评论,我发现您对于放置位置以及如何命名是obviously编程中最困难的事情之一有一些顾虑。

      所以我清除这种困惑的想法是:

      图层:是属于一起的类,方法等的逻辑分离或集合点。

      每个图层可以包含多个项目或程序集。因此,如果要将项目分类为图层,可以在解决方案中创建名为图层的directories,并将各个项目放在这些目录中。这真的只是嘴里的味道问题,就像小费一样。

      示例结构

      1. 解决方案根
      2. 核心目录
        • 域程序集:您拥有业务或域实体的域的根目录以及域正在使用的所有接口。
        • 域服务程序集(也可以在域程序集中)
      3. 服务目录
        • 应用程序服务程序集:例如,此程序集包含跨越多个域实体或聚合等操作的服务或外观。)
      4. 基础设施目录
        • 存储库程序集:这是您拥有EF存储库的实现的地方
        • 自定义日志记录/电子邮件/不属于该域的任何其他程序集或实现。
        • DependencyResolution程序集:这是NInject模块和所有IOC容器相关接线的位置。
      5. UI目录
        • WebAPI程序集
        • Asp.Net MVC程序集
      6. 摘要

        依赖性解析项目引用了任何所需的程序集(接口的域,其实现的服务/基础结构),并将它们连接起来供以后使用。

        WebAPI项目只需要引用添加的域和依赖关系解析,这样你就可以在WebAPI方法/函数公共构造函数中询问你的接口,Ninject将在幕后为你做脏工作。

        请不要忘记,这只是我的一个简单快速的脏架构建议,不知道您的确切要求和用例。

答案 1 :(得分:4)

如果我理解了您的问题,那么您在配置存储库层时遇到了麻烦,因为您的配置代码位于您的应用程序层中,该应用程序层可能只引用您的服务层(后者又引用您的存储库层)。我为解决这个问题所做的工作首先是在模块中创建配置(这些配置可以存在于任何层,但您必须参考Ninject)

对于您的回购图层:

public class RepoNinjectModule : NinjectModule
{
    public override void Load()
    {
        Bind<IMyRepo>().To<MyRepo>();
    }
}

在服务层中创建一个类似的模块:

public class ServiceNinjectModule : NinjectModule
{
    public override void Load()
    {
        Bind<IMyService>().To<MyServce>();
    }
}

然后,在您的应用程序层中,您可以动态加载模块(这是NinjectWebCommon.cs的样子):

private static void RegisterServices(IKernel kernel)
{
    kernel.Load(AppDomain.CurrentDomain.GetAssemblies());
}

有关模块的更多信息:https://github.com/ninject/Ninject/wiki/Modules-and-the-Kernel