【问题标题】:Web api access controller method from another controller methodWeb api 从另一个控制器方法访问控制器方法
【发布时间】:2020-01-12 20:50:21
【问题描述】:

我有两个不同的控制器 --> 控制器 A,控制器 B

而且我每个控制器都有不同的方法和它们的返回值IHttpActionResult (Method A controller A ,Method B and Controller B)

如何访问另一个控制器方法并从另一个控制器获取其内容

控制器 B 和内部方法 B

IHttpActionResult result = ControllerA.MethodA()

我想读取控制器 B 中的 result.content

【问题讨论】:

    标签: c# asp.net-web-api


    【解决方案1】:

    当请求到来时,只有应该处理请求的控制器会被自动实例化。您可以手动实例化第二个控制器,但我建议将 MethodA 功能移动到基本控制器类

    public class BaseController : ApiController
    {
       // ...
    
       public IHttpActionResult MethodA(int id)
       {
           var foo = repository.Get(id);
           if (foo == null)
               return NotFound();
    
           return Ok(foo);
       }
    }
    
    public class ControllerA : BaseController
    {
       //...
    }
    
    public class ControllerB : BaseController
    {
       public IHttpActionResult MethodB(int id)
       {
           var result = MethodA();
           //..
       }
    }
    

    或将通用逻辑移至单独的类(例如服务),这样您就可以从两个控制器中调用它。

    public class ControllerA : ApiController
    {
       private IFooService fooService;
    
       public ControllerA(IFooService fooService)
       {
           this.fooService = fooService;
       }
    
       public IHttpActionResult MethodA(int id)
       {
          // use fooService.Method()
       }
    }
    
    public class ControllerB : ApiController
    {
       private IFooService fooService;
    
       public ControllerB(IFooService fooService)
       {
           this.fooService = fooService;
       }
    
       public IHttpActionResult MethodB(int id)
       {
            // use fooService.Method()
       }
    }
    

    【讨论】:

      【解决方案2】:

      我会考虑为两个控制器使用一个通用的基类(如果你想在两个控制器上都使用一个方法)

      例如

      public abstract class MyBaseController
      {
          public void CommonMethod()
          {
              // Do something here
          }
      }
      

      然后像这样使用它们

      public class ControllerA : MyBaseController
      {
          public void MethodA()
          {
              base.CommonMethod();
      
              // Do something else
          }
      }
      
      public class ControllerB : MyBaseController
      {
          public void MethodB()
          {
              base.CommonMethod();
      
              // Do Something else
          }
      }
      

      【讨论】:

        【解决方案3】:

        1) 你可以使用里面的静态类和静态方法来共享给其他控制器

        public static class CommonMethods
        {
            public static string SomeMethod(string s)
            {
                string RetString;
                ...
                return (RetString);
            }
        }
        

        现在您可以在任何控制器中使用它

        string SomeMethodResult = CommonMethods.SomeMethod("Say Hello");
        

        2)另外一种方法是创建一个控制器类的实例并调用实例方法:

        public class V1Controller : ApiController
            {
                public void Put(int id, [FromBody]string value)
                {
                    HomeController hc = new HomeController();
                    hc.SomeMethod();
                }
            }
        

        【讨论】:

        • 选项 2 正是我所需要的。谢谢!
        【解决方案4】:
        AController aController = new AController();
        var getResponse = aController.YourMethod(values);
        

        如果您的方法返回 Json,那么您可以轻松解决它

        JavaScriptSerializer().Deserialize
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-11
          • 1970-01-01
          • 2015-08-02
          • 1970-01-01
          • 2014-06-06
          • 1970-01-01
          • 1970-01-01
          • 2011-09-23
          相关资源
          最近更新 更多