【问题标题】:Abstract common code between MVC 5 Controllers and Web Api ControllersMVC 5 控制器和 Web Api 控制器之间的抽象公共代码
【发布时间】:2015-03-05 21:20:38
【问题描述】:

我有一个带有 ASP .Net MVC 5 前端和 Web Api 2 服务层的应用程序,我想使用依赖注入,因此 MVC 5 控制器仅依赖于 Web Api 2 的抽象。

由于 Web Api 控制器大多使用这种签名:

public IHttpActionResult SomeMethod(){ return Ok(); }

我的第一个想法是界面应该是:

IHttpActionResult SomeMethod();

现在我有一个包含服务接口的类库,但这意味着这个类库需要引用 System.Web.Http 才能在签名中使用 IHttpActionResult 接口。

我有两个问题:

  1. 首先感觉这个库引用 System.Web.Http 是对的,有没有替代方法?
  2. 如果没有替代方案,当我尝试添加引用时,我只会得到一个没有该接口定义的旧版本的库,我可以从哪里获得正确的版本?

谢谢。

【问题讨论】:

    标签: c# asp.net-mvc-5 asp.net-web-api2


    【解决方案1】:

    我会将通用逻辑放入具有“正常”输入和输出的通用库中。然后两个传输(MVC 和 web api)可以调用这个库

    【讨论】:

      【解决方案2】:

      这实际上取决于您要实现的目标 - 也就是您想要引入多少抽象。

      如果您不想将所有常见的业务逻辑转移到服务中以便从这里以及可能在任何地方重用,那么是的,您希望摆脱 System.Web.Http 引用。

      通过一个干净的接口/实现来做到这一点,它只返回类似这样的操作结果:

      public interface ICustomerService 
      {
          BaseResponse DoSomething(BaseRequest request);
      }
      
      public abstract class BaseResponse 
      {
          public bool IsSuccess { get; set; }
          public IList<string> Errors { get; set; }
      }
      
      /*
      Note: BaseResponse & BaseRequest, follow the command pattern for passing information you would impliment concrete versions of these.
      */
      

      然后,我允许 Web 和 Api 的控制器控制如何使用此 BaseResponse 来响应……响应。

      所以也许创建一个BaseControllerBaseApiController

      例如:

      public abstract class BaseApiController : ApiController 
      {
              protected HttpResponseMessage HandleResponse(BaseResponse response)
              {
                  return
                      !response.IsSuccess
                          ? Request.CreateErrorResponse(HttpStatusCode.BadRequest, response.Errors )
                          : Request.CreateResponse(HttpStatusCode.OK, response);
              }
      }
      

      还有:

      public abstract class BaseController : Controller
      {
          protected ActionResult HandleResponse(BaseResponse response, string redirectToAction)
          {
              if (response.IsSuccess) 
                  return RedirectToAction(redirectToAction);
      
              foreach (var error in response.Errors)
              {
                  ModelState.AddModelError(string.Empty, error);
              }
      
              return View();
          }
      }
      

      然后在WebApi Controller中:

      public HttpResponseMessage DoAction(string param1)
          {
              return HandleResponse(_customerService.DoSomething(new DoActionRequest { Param1 = param1 }));
          }
      

      在 Web 控制器中

      public ActionResult DoAction(ViewModel viewModel)
          {
              var response = _customerService.DoSomething(new DoActionRequest { Param1 = param1 });
      
              return HandleResponse(response, "Success");
          }
      

      通过这种方式,所有业务逻辑都被隐藏起来并可以重用,并且 ApiController 和 Controller 可以以自己独特的方式响应。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-01
        • 2014-08-11
        • 1970-01-01
        • 2023-04-01
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多