1

我正在构建一个简单的 Web API 控制器来管理公司实体。我试图通过使用 Ninject 将所有逻辑移到服务类(依次调用 repo)来管理依赖关系,从而将所有逻辑从控制器中移开。一切都很好,直到我需要在 Delete 操作上返回一个 HttpResponseMessage 对象。我不断收到请求对象“无法解析符号‘请求’”的错误

如何在不是控制器的文件中使用(或获取上下文?)请求对象?

公司控制器.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);
    }
}

公司服务.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);
    }
}
4

2 回答 2

1

如果您想访问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 绑定。

于 2013-03-28T18:18:20.243 回答
1

Kronprinz,您的服务属于另一层 - 它不应该知道任何有关 HttpRequests/Responses 的信息。例如,它可以在 WinForm / WPF 或 Web 应用程序中重用。如果它不能执行操作,让它抛出一个异常并在你的控制器中处理它,这反过来会创建一个适当的 HttpResponseMessage。

于 2013-03-28T18:21:52.447 回答