这实际上取决于您要实现的目标 - 也就是您想要引入多少抽象。
如果您不想将所有常见的业务逻辑转移到服务中以便从这里以及可能在任何地方重用,那么是的,您希望摆脱 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 来响应……响应。
所以也许创建一个BaseController 和BaseApiController:
例如:
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 可以以自己独特的方式响应。