【问题标题】:ASP.NET Web API Controllers without System.Web.Http (Pluggable, Decoupled Architecture)没有 System.Web.Http 的 ASP.NET Web API 控制器(可插拔、解耦架构)
【发布时间】:2014-08-08 00:59:39
【问题描述】:

我正在使用 ASP.NET Web API 创建一个可插入的项目框架。我有很多胆量,但我在架构的一部分方面遇到了问题,我不完全确定如何解耦。

作为一个简化的例子,我有以下内容:

  • Service/Presentation Layer(简单的 Web API 托管项目,内部很少,它基本上只是一个处理 IIS 中托管或自托管的外壳)
  • 领域层,包含项目的核心、领域层部分
  • Services(N个服务,每个都引用Domain层:想想微服务)。目前,这些服务中的每一个都引用了 ASP.NET Web API 2.1

现在,服务都引用了域层,因为它有接口、助手等。但是,域层也引用了 ASP.NET Web API 2.1 等内容。我的想法是在域中拥有一个基本的“BaseController”,每个服务的控制器都可以从中继承,并且反过来都必然会继承诸如 Get()、Post() 等已连接的东西。问题是我不希望这些服务中的每一个也必须引用 ASP.NET Web API 2.1 和其他依赖项。我希望他们能够通过抽象来使用它们,而无需直接引用它们。换句话说,我想要更松散的耦合,并希望服务能够独立于 System.Web.Http 自主地生活。随着项目的发展,它将帮助我执行单元测试和 SOLID 原则。

也许我在这里采取了错误的方法,但也许不是。我的主要目标是使用 ASP.NET Web API 创建一个可插入的微服务框架,每个微服务都作为一个独立的程序集存在。因此,如果有其他推荐的方法,我会全力以赴。

希望这是有道理的。任何指针?值得一提的是,我对设计模式和 SOLID 原则的概念非常熟悉;只是不确定如何在保持控制器本机提供的一些自动请求处理的同时将所有这些串在一起。

谢谢!

【问题讨论】:

    标签: asp.net .net design-patterns architecture asp.net-web-api


    【解决方案1】:

    您的意图很好,实施不多。您实际上称为应用程序服务,这些服务是使用域实现应用程序用例的服务。当说你不想耦合到 System.Web.Http 等时,我想你想说你不希望你的应用程序(尤其是域)耦合到 WebApi 框架。

    我认为您误解了脱钩的含义。这实际上并不是关于一个组件不依赖于另一个组件,而是关于不将您的对象/层与其他对象/层的实现细节耦合。这就是为什么域应该永远知道控制器、WebApi、Mvc 等它们不是域的一部分,它们是 UI 或公共 API 的一部分。

    只是 API 层(名称巧合)应该了解控制器和您正在使用的任何框架(顺便说一下 WebApi),其他任何东西都只知道它们的关注点。所以API(使用)-> 应用层-> 域。

    拥有自主组件是可以的,但您真的不希望只有一个组件来处理所有事情。保持东西干净,并有类似的东西:

    • MyFeature.ApplicationServices
    • MyFeature.Domain
    • MyFeature.Persistence
    • 甚至 MyFeature.UIWidgets(Web/Wpf 等)

    这只是一个建议,重要的是要保持关注点分开。

    这里有一些代码

    public class MyAppService 
    {
           public void DoSmth(InputData data){}
    }
    
    public class MyApiController
    {
         public MyApiController(MyAppService svc) { }
    
         public void Post(SomeModel model)
         {
            var svcInput=model.ToServiceInput();
            _svc.DoSmth(svcInput);
         }
    
    }
    

    您的应用服务从控制器获取输入模型并使用它来完成其工作。服务永远不知道 webApi 或任何东西,只知道输入模型。而且事情是解耦的,易于测试。

    【讨论】:

    • 这绝对是有道理的。谢谢你非常详细的回答。如果我没记错的话,我对您描述的方法非常熟悉(从学术角度来看)并且还听说它也称为编排层(AppServices)。我绝对可以看到这如何更好地工作。这种方法的主要原因是为开发人员提供以尽可能少的行创建“服务”的能力,因此继承了基础 ApiController。我可能只是把它复杂化了。关于“脱钩”一词的好点;我以一种通用且令人困惑的方式使用它。 :)
    • 说了这么多,你能想出一种方法来帮助我实现“超级简单的微服务创建”的目标吗?换句话说,我希望开发人员能够创建一个新的类库,创建一个控制器子类,并自动获得 Web API 请求处理的自动连接?所有这些都不需要显式引用 System.Web.Http?我已经发现了很多其他组件,例如运行时程序集加载和控制器探测,但这部分让我陷入了一个循环。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2013-06-23
    • 2013-04-04
    • 1970-01-01
    相关资源
    最近更新 更多