将默认控制器CRUD方法移动到服务类.创建响应消息的问题
本文关键字:创建 响应 消息 问题 服务 控制器 默认 CRUD 方法 移动 | 更新日期: 2023-09-27 18:06:34
我正在构建一个简单的Web API控制器来管理Company实体。我试图通过使用Ninject来管理依赖关系,将所有逻辑从控制器移到服务类(反过来调用repo)中。一切都很顺利,直到我需要在Delete操作上返回一个HttpResponseMessage对象。我一直得到一个错误的请求对象"无法解析符号'请求'"
我怎么能工作(或得到上下文?)的请求对象在一个文件,不是控制器?
CompanyController.cs
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);
}
}
如果您想要访问控制器之外的Request
对象(即。在一个服务类中),你可以使用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,你的服务属于另一层-它不应该知道任何关于httprequest/Responses。例如,它可以在WinForm/WPF或Web应用程序中重用。如果它不能执行一个操作,让它抛出一个异常,并在你的控制器中处理它,这反过来会创建一个适当的HttpResponseMessage