Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将默认控制器CRUD方法移动到服务类。创建响应消息的问题_C#_.net_Asp.net Mvc 4_Dependency Injection_Asp.net Web Api - Fatal编程技术网

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

C# 将默认控制器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

我正在构建一个简单的WebAPI控制器来管理公司实体。我试图通过使用Ninject管理依赖关系,将所有逻辑从控制器移入一个服务类(该服务类反过来调用repo)来转移。一切都很顺利,直到我需要在Delete操作上返回一个HttpResponseMessage对象。我一直在请求对象“无法解析符号'Request'”上遇到错误

我如何在一个不是控制器的文件中处理(或获取上下文?)请求对象

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);
    }
}

如果要访问控制器外部(即服务类中)的
请求
对象,可以使用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管理、本地化相关服务)。然后你可以使用这种方法。是的,我开始意识到这一点。见我对博兰回答的回复:)