将默认控制器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);
    }
}

将默认控制器CRUD方法移动到服务类.创建响应消息的问题

如果您想要访问控制器之外的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