DI容器2层

Rom*_*syk 8 c# architecture dependency-injection asp.net-web-api

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

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

Repository层具有接口IRepository<T>和一些实现.并且在Service中还存在IService<T>具有两种不同实现的接口.

如果我在WebApi项目中使用DI容器(Ninject)绑定IService<T>ServiceConcrete<T>服务项目中的DI容器来绑定IRepository<T>RepositoryConcrete<T>?,请指教我吗?

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

kay*_*ess 15

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

概观

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

细节

  1. 应该很容易创建项目,例如从NuGet添加Ninject作为参考.
  2. 新的类文件(S)添加到这个项目,你想创建一个类似的模块后命名为:ServiceModule.cs,RepositoryModule.cs,等创建Ninject模块(一个或多个).有关详细说明,请参阅我的答案.
  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);
    }  
    
    Run Code Online (Sandbox Code Playgroud)

我还将尝试解决与您的问题松散相关的另一个问题.我认为您当前的分层设置需要稍微改变一下.

你的图层的基本和可能是我最大的问题是你混淆并因此紧密地结合域和存储库,这显然是一个基础设施问题.

我建议你重新构建你的图层:

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

不要忘记您的域层应具有任何想法基建像库的细节,否则你要紧密结合域与不必要的实施细节.

编辑:从评论我看到你有一些关于放置位置以及如何命名的问题,这显然是编程中最难的事情之一.

所以我清除这种混乱的想法是:

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

每个图层可以包含多个项目或程序集.所以,如果你想你的项目归类为层,您可以创建目录,在您的解决方案命名你的图层,并把这些目录内的个别项目.这真的只是嘴里的味道问题,就像小费一样.

示例结构

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

摘要

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

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

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