没有System.Web.Http的ASP.NET Web API控制器(可插入,解耦架构)

trn*_*son 1 .net architecture asp.net design-patterns asp.net-web-api

我正在使用ASP.NET Web API创建一个可插拔的项目框架.我有很多胆量已经弄明白但是我对架构的一部分有问题,我不完全确定如何解耦.

作为简化示例,我有以下内容:

  • 服务/表示层(简单的Web API托管项目,在此内部很少,它基本上只是一个处理IIS中的托管或自托管的shell)
  • 域层,包含项目的核心,域层部分
  • 服务(N个服务,每个服务都引用了Domain层:思考微服务).目前,这些服务中的每一个都引用了ASP.NET Web API 2.1

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

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

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

谢谢!

Mik*_*eSW 5

你的意图很棒,实施不是那么多.您实际上称为Application Services,即使用Domain实现应用程序用例的服务.当你说你不想加入System.Web.Http等时,我想你想说你不希望你的应用程序(特别是Domain)加入WebApi框架.

我认为你误解了解耦意味着什么.它不是关于一个不依赖于另一个的程序集,而是关于不将对象/层耦合到其他对象/层的实现细节.这就是为什么Domain 永远不会知道控制器,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);
     }

}
Run Code Online (Sandbox Code Playgroud)

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