C# 现代分层体系结构实现

C# 现代分层体系结构实现,c#,asp.net-mvc,domain-driven-design,inversion-of-control,C#,Asp.net Mvc,Domain Driven Design,Inversion Of Control,我最近读完了迪诺·埃斯波西托(Dino Esposito)的一本好书,他在书中提出了一个建议,为web应用程序提供一个域驱动的分层体系结构。我一直在为我看到的一条类似于下面的建议而挣扎: 特别是在基础设施层制定的国际奥委会。我理解这背后的原因,这对我来说很有意义,但是如何在ASP.NET MVC框架的范围内充分实现这一点?要添加依赖项解析器,您需要实现System.Web.MVC命名空间中存在的接口 在过去的项目中,我通常会在启动文件夹中的MVC应用程序中实现IoC,但这似乎与布局建议不一致

我最近读完了迪诺·埃斯波西托(Dino Esposito)的一本好书,他在书中提出了一个建议,为web应用程序提供一个域驱动的分层体系结构。我一直在为我看到的一条类似于下面的建议而挣扎:

特别是在基础设施层制定的国际奥委会。我理解这背后的原因,这对我来说很有意义,但是如何在ASP.NET MVC框架的范围内充分实现这一点?要添加依赖项解析器,您需要实现System.Web.MVC命名空间中存在的接口

在过去的项目中,我通常会在启动文件夹中的MVC应用程序中实现IoC,但这似乎与布局建议不一致

我不想把这变成一个意见类型的问题,我所寻找的只是一种可能的、实际的具体方法来实现这个模式,而不必将System.Web.MVC名称空间拖到基础架构层

编辑

为了给建议的架构添加一个后续图,以及我仍然感到困惑的部分,迪诺的建议似乎确实将IoC容器放入了基础设施组件中:

回答您的问题 基本上,您的问题是“我正在寻找一种可能的、实际的具体方法来实现此模式,而无需将System.Web.MVC名称空间拖到基础架构层”

有一种方法可以做到这一点,它包括引入一个新的IoC容器库,一个专门用于此目的的库

idependencysolver
不一定是您的系统范围的分辨率接口-它只是MvC使用的接口。还有其他IoC容器,其中许多提供了适配器,以注入封装IoC逻辑的
IDependencyResolver
实现

这允许一些事情:

  • 依赖于执行显式解析能力的MvC组件仍然可以依赖于
    IDependencyResolver
  • 系统中的其他层可以依赖于不同的分辨率接口,因此包含对独立的适合用途组件的引用
  • MvC层和其他层都将访问同一组依赖项/实现注册
  • 支持此功能的IoC容器的一些示例:

    • -与

      • 您可以看到示例的最后一行是:

        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        
      • 在该行之后,依赖于
        idependencysolver
        的任何MvC组件都将自动获取
        autofacDependencySolver
        ,该解析器包装对Autofac容器的调用

    • -
    以下是一个可以帮助您选择适合您的选项

    [实际实施问题-也就是我对为什么这不是一个好主意的看法] 在我看来,您在过去的项目中仅在Mvc应用程序中使用IoC的做法更为正确,因此以下概念可能已经为您所熟悉,但当您考虑从该领域引用IoC时,我认为值得探讨

    第一个问题——为什么? 虽然这个答案提供了一种方法来满足您的要求,但基于该图,我承认我不清楚依赖域层的IoC解析器的目的是什么,以及为什么需要这样做

    如果您发现自己在这样做,您可能会意外地使用

    正如该博客中所述,不需要依赖IoC解析器(或定位器)——只需依赖于您所需的服务,并让IoC注入适当的实现


    理解意图的部分问题在于图表本身——人们通常会把一些方框放在一起,然后把它们连接起来,然后画出图表——而从来都不清楚这些线条的意思。它们是依赖链吗?它们是执行顺序吗?从域模型框到基础结构层的实际标签之间有一条线意味着什么???这不依赖任何东西吗?或者说明此处未阐明的可能依赖关系

    什么应该使用IoC解析器? 系统中唯一应该直接引用IoC解析器的部分是合成根,它实际上是应用程序的入口点。第一部分“连接对象图”——实际上,它记录了如何解决从所依赖的接口到适当的具体实现的所有可能的依赖关系

    然后它解析入口点对象(或者注册一个
    idependencysolver
    ,以便Mvc可以解析入口点对象,也称为控制器)。解析条目对象时,它会自动解析它的所有依赖项,在解析下一层依赖项的过程中,依此类推,直到到达没有依赖项的类为止。如果您正在进行DDD,那么它很可能是您的域层

    无依赖域层和洋葱结构 因为您对DDD感兴趣,所以人们普遍认为域层不应该依赖于域层中未定义的任何内容。如果确实需要使用基础设施组件(如存储库)的服务,请使用分离的接口,并将接口放在域层中,但将实现放在具体的持久性层中

    这种建筑模式被称为

    使用其他IoC容器 虽然我不认为有必要从域层(或任何层)引用IoC解析器/定位器,但我仍然认为采用单独的专用IoC容器库是有价值的,如上所述

    其价值在于一些更灵活的服务配置选项,包括一些漂亮的基于约定的自动配置