2015-08-09 40 views
0

我有一个C#MVC web应用程序。 我有2个控制器。每个人都有返回HttpResponseMessage这一行的方法:调用不同的控制器,但保存请求?

return Request.CreateResponse(<StatusCode>, <value>); 

我需要在控制器2是方法2将调用方法1在控制器1,得到它的响应,并使用它来创建自己的反应。于是我在控制器2的方法2创建控制器1,比调用它的方法1 -

// Controler 1 
[InitializeSimpleMembership] 
public class ItemsController : ApiController, IDisposable 
{ 
     Service1 m_s1; 
     Service2 m_s2; 
     Service3 m_s3; 
     Service4 m_s4; 
    // Controler 1 constructor 
     public ItemsController (Service1 s1, Service2 s2, Service3 s3, Service4 s4) 
     { 
      m_s1 = s1; 
      m_s2 = s2; 
      m_s3 = s3; 
      m_s4 = s4; 
     } 
     // Controler 1 Method1 
     [AllowAnonymous] 
     [HttpPost] 
     public HttpResponseMessage Method1(IEnumerable<Item> items) 
     { 
      List<Item> items2 = new List<Item>(); 
      // ... 
      if (...) 
      { 
       return Request.CreateResponse(HttpStatusCode.OK, items2); 
      } 
      else 
      { 
       return Request.CreateResponse(HttpStatusCode.InternalServerError, errorList); 
      } 
     } 
} 

// Controler 2 
[InitializeSimpleMembership] 
public class CarsController : ApiController, IDisposable 
{ 
     Service1 m_s1; 
     Service4 m_s4; 
     Service5 m_s5; 

     // Controler 2 Constructor 
     public CarsController(Service1 s1, Service4 s4, Service5 s5) 
     { 
      m_s1 = s1; 
      m_s4 = s4; 
      m_s5 = s5; 
     } 

     // Controler 2 method2 
     [AllowAnonymous] 
     [HttpPost] 
     public HttpResponseMessage Method2(Car car) 
     { 
      // ... 
      Service2 s2 = new Service2(); 
      Service3 s3 = new Service3(); 
      ItemsController itemsController = new ItemsController (m_s1, s2, s3, m_s4); 
      HttpResponseMessage response = itemsController.Method1(items); 
      List<Item> items2; 
      response.TryGetContentValue<List<Item>>(out items2); 
      return Request.CreateResponse(HttpStatusCode.OK, items2); 
     } 
} 

的问题是,当我创建控制器1(上述ItemsController)这样的 - 它没有“请求”(它为空)。 于是,我就发送这样的请求 -

[AllowAnonymous] 
    [HttpPost] 
    public HttpResponseMessage Method1_Shell(IEnumerable<Item> items, HttpRequestMessage request) 
    { 
     if (Request == null) 
     { 
      Request = request; 
     } 
     return Method1(items); 
    } 

但我不知道是否有更好的方法来做到这一点。

回答

1

我需要controller2中的method2将调用controller1中的method1,获取它的响应并使用它来创建它自己的响应。因此,我在controller2的method2中创建controller1,并调用其方法1

我认为这是在您的应用程序中错误地分割的问题。在这种情况下,我会建议你创建一些服务来完成你在ItemsController中所做的工作,并在两个控制器之间共享。

使用共享服务的方式你得到至少以下好处:

  1. 您可以从紧耦合和不必要的复杂逻辑摆脱与其他控制器的实例并调用其方法。

  2. 您的其他控制器看起来更简单,没有第二个参数 HttpRequestMessage参数。

+0

是的,但我会采取了很多的工作,保时间,我不能做到这一点,现在,只有在未来。我需要处理现有的情况。 (我不是我的老板:)) – TamarG

+0

@TamarG我不熟悉你的情况,但是通过查看你提供的代码示例,我可以说'CarsController'中的代码与'ItemsController'非常耦合。因此,将来很难做出进一步的改变,它可能会让你的老板信服): –

+0

这不是我真正的代码,当然,我改变了代码和名称,尽可能地将其作为一般数据,只在这里复制我需要这个例子。在我的代码中 - 每个控制器在每种方法中都有很多方法和一个长代码...... :) – TamarG

0

我认为它更好,如果您使用请求uri并在controller2发送一个http请求到controller1。获取响应并编辑。

相关问题