gpt4 book ai didi

c# - 2层DI容器

转载 作者:太空狗 更新时间:2023-10-29 18:09:09 25 4
gpt4 key购买 nike

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

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

  • 存储库层具有 IRepository<T>接口(interface)及其一些实现。并且在Service中还存在带有两种不同实现的 IService<T>接口(interface)。

    您能否建议我在WebApi项目中使用DI容器(Ninject)来绑定(bind) IService<T>ServiceConcrete<T>,而在Service项目中使用DI容器来绑定(bind) IRepository<T>RepositoryConcrete<T>

    还是我应该在WebAppi项目中仅使用一个DI?

    最佳答案

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

    概述

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

  • 细节
  • 应该像create a project一样容易,例如从NuGet添加Ninject作为引用。
  • 将新的类文件添加到此项目,并以您要创建的模块命名,例如:ServiceModule.csRepositoryModule.cs等。
    创建您的Ninject module(s)。有关此的详细说明,您可以引用我的answer
  • 在WebAPI项目中,您添加对刚创建的DependencyResolution项目和Domain项目的引用。
  • 在WebAPI项目的NinjectWebCommon.cs中以以下方式初始化/注册刚创建的模块:
    private static void RegisterServices(IKernel kernel)
    {
    var modules = new List<INinjectModule>
    {
    new ServiceModule(),
    new RepositoryModule()
    };

    kernel.Load(modules);
    }


  • 我还将尝试解决与您的问题松散相关的另一个问题。我认为您当前的分层设置需要进行一些更改。

    您的图层的基本(可能是我最大的问题)是您混合使用 ,因此将Domain和Repository紧密耦合在一起,这显然是的基础结构问题。

    我建议将您的图层重新架构为:
  • 服务
  • 基础结构(例如,存储库实现可以在此处使用)
  • 依赖关系解决方案
  • WebAPI

  • 不要忘记您的Domain层应该 而不是对诸如存储库之类的基础结构细节有任何想法,否则您将把您的域与不需要的实现细节紧密地结合在一起。

    编辑:从这些注释中,我看到您对在哪里放置以及如何命名事物感到有些担忧,这是 obviously编程中最难的事情之一。

    因此,我消除这种困惑的想法是:

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

    每个层可以包含多个项目或程序集。因此,如果要将项目分类为图层,则可以在解决方案中创建关于图层的名称 directories并将各个项目放置在这些目录中。实际上,这只是口中的问题,仅作为提示。

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

  • 概括

    “依赖关系解决方案”项目引用了任何所需的程序集(用于接口(interface)的域,用于其实现的服务/基础结构),并将它们全部连接起来以备后用。

    WebAPI项目仅需要添加引用的“域和依赖关系解析”,因此您只需在WebAPI方法/函数公共(public)构造函数中请求接口(interface),Ninject就会在幕后为您完成肮脏的工作。

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

    关于c# - 2层DI容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35025906/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com