C# 将默认控制器CRUD方法移动到服务类。创建响应消息的问题
我正在构建一个简单的WebAPI控制器来管理公司实体。我试图通过使用Ninject管理依赖关系,将所有逻辑从控制器移入一个服务类(该服务类反过来调用repo)来转移。一切都很顺利,直到我需要在Delete操作上返回一个HttpResponseMessage对象。我一直在请求对象“无法解析符号'Request'”上遇到错误 我如何在一个不是控制器的文件中处理(或获取上下文?)请求对象 CompanyController.csC# 将默认控制器CRUD方法移动到服务类。创建响应消息的问题,c#,.net,asp.net-mvc-4,dependency-injection,asp.net-web-api,C#,.net,Asp.net Mvc 4,Dependency Injection,Asp.net Web Api,我正在构建一个简单的WebAPI控制器来管理公司实体。我试图通过使用Ninject管理依赖关系,将所有逻辑从控制器移入一个服务类(该服务类反过来调用repo)来转移。一切都很顺利,直到我需要在Delete操作上返回一个HttpResponseMessage对象。我一直在请求对象“无法解析符号'Request'”上遇到错误 我如何在一个不是控制器的文件中处理(或获取上下文?)请求对象 CompanyController.cs public class CompanyController : Api
public class CompanyController : ApiController
{
private ICompanyService _companyService;
public CompanyController(ICompanyService companyService)
{
_companyService = companyService;
}
// DELETE api/CompTest/5
public HttpResponseMessage DeleteCompany(int id)
{
return _companyService.Delete(id);
}
}
CompanyService.cs
public class CompanyService : ICompanyService
{
public readonly IUnitOfWork _unitOfWork ;
private readonly ICompanyRepository _companyRepository;
public CompanyService(IUnitOfWork unitOfWork, ICompanyRepository companyRepository)
{
_unitOfWork = unitOfWork;
_companyRepository = companyRepository;
}
public HttpResponseMessage Delete(int id)
{
var company = _companyRepository.GetCompanyById(id);
if (company == null)
{
//ERROR HERE
return Request.CreateResponse(HttpStatusCode.NotFound);
}
_companyRepository.Delete(company);
try
{
_companyRepository.Save();
}
catch (DbUpdateConcurrencyException ex)
{
//ERROR HERE
return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
}
//ERROR HERE
return Request.CreateResponse(HttpStatusCode.OK, company);
}
}
如果要访问控制器外部(即服务类中)的
请求
对象,可以使用HttpContextBase类
public class CompanyService: ICompanyService
{
private readonly HttpContextBase _context;
public CompanyService(HttpContextBase context)
{
_context = context;
}
public HttpResponseMessage Delete(int id)
{
_context.Request ....
}
}
Ninject使用HttpContextWrapper对象自动解析此HttpContextBase依赖项。对于ninject,只应添加CompanyService绑定 Kronprinz,您的服务属于另一层-它不应该知道任何关于HttpRequests/Response的信息。例如,它可以在WinForm/WPF或Web应用程序中重用。如果它不能执行操作,让它抛出一个异常并在您的控制器中处理,这将创建一个适当的HttpResponseMessage。将请求注入到您的服务类中。实际上,我开始怀疑这是否是错误的方法。如果我在当前请求中通过了,我认为这将打破依赖倒置原则。。。没有其他类或进程能够使用该服务。那么,最好返回通用/自定义响应,并在客户端处理它。现在,如果我有另一个非控制器类或业务流程调用CompanyService.Delete,该怎么办?因为有时我可能想删除一个帐户,作为其他操作的副作用。@Kronprinz在域服务中注入表示层对象(在您的情况下为请求对象)不是一个好主意。你应该重新考虑你的方法。但是,有些服务只能由您的表示层访问(可能是cookie管理、本地化相关服务)。然后你可以使用这种方法。是的,我开始意识到这一点。见我对博兰回答的回复:)