Web api访问控制器方法来自另一种控制器方法

Bil*_*han 6 c# asp.net-web-api

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

我有不同的方法每个控制器及其返回值 IHttpActionResult (Method A controller A ,Method B and Controller B)

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

控制器B和内部方法B.

IHttpActionResult result = ControllerA.MethodA()
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*kiy 7

请求到来时,只有应该处理请求的控制器自动实例化.您可以手动实例化第二个控制器,但我建议将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();
       //..
   }
}
Run Code Online (Sandbox Code Playgroud)

或者将公共逻辑移动到单独的类(例如服务),这样您就可以从两个控制器中调用它.

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()
   }
}
Run Code Online (Sandbox Code Playgroud)


ry8*_*806 5

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

例如

public abstract class MyBaseController
{
    public void CommonMethod()
    {
        // Do something here
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用它们

public class ControllerA : MyBaseController
{
    public void MethodA()
    {
        base.CommonMethod();

        // Do something else
    }
}

public class ControllerB : MyBaseController
{
    public void MethodB()
    {
        base.CommonMethod();

        // Do Something else
    }
}
Run Code Online (Sandbox Code Playgroud)