Saltar al contenido

ASP.Net Core Llamar a un controlador desde otro controlador

Solución:

¿Cómo puedo usar el sistema de inyección de dependencias integrado en ASP.Net 5 para crear una instancia del controlador API requerido para mí?

En tus Startup.cs puede decirle al MVC que registre todos sus controladores como servicios.

services.AddMvc().AddControllersAsServices();

Luego, simplemente puede inyectar el controlador deseado en su otro controlador a través del mecanismo DI e invocar su método de acción.

No lo hagas. Mueva esa lógica a otro componente que se comparta entre los 2 controladores. El marco envía el controlador como resultado de una llamada HTTP, no es su superficie API pública. En general, sus controladores deben usarse como el lugar donde la solicitud HTTP se transforma en objetos comerciales. Las operaciones en esos objetos deben delegarse a otra capa (especialmente si necesita usarse desde más de un lugar en su aplicación).

Para poder utilizar un controlador de otro controlador, necesita:

  1. Registre el controlador en Startup.cs ConfigureServices: services.AddTransient <Areas.Api.Controllers.FoobarController, Areas.Api.Controllers.FoobarController>();
  2. Debe pasar el controlador al que desea acceder como parámetro ctor al controlador principal.

Si necesita acceder a propiedades locales en el controlador, como User o Url Hay dos maneras de hacer esto.

La primera forma es usar DI para obtener una instancia de IHttpContextAccessor acceder User y IUrlHelper acceder Url objetos:

public class FoobarController : Controller
{
    private readonly ApplicationDbContext _dbContext;
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly IUrlHelper _urlHelper;
    public FoobarController(ApplicationDbContext dbContext, IHttpContextAccessor httpContextAccessor, IUrlHelper _urlHelper, [...])
    {
         _dbContext = dbContext;
         _httpContextAccessor = httpContextAccessor;
         _urlHelper = urlHelper;
    }

    public FoobarResponse List(FoobarRequest request)
    {
        var userId = _httpContextAccessor.HttpContext.User.GetUserId();
        var response = new FoobarResponse();
        response.List = _dbContext.Foobars.Where(f => f.UserId == userId).ToList();
        response.Thumb = 
        return response;
    }
}

La segunda forma es configurarlo en el controlador de llamada:

public class HomeController : Controller
{
    private Areas.Api.Controllers.FoobarController _foobarController;
    public HomeController(Areas.Api.Controllers.FoobarController foobarController)
    {
        _foobarController = foobarController;
    }

    private void InitControllers()
    {
        // We can't set this at Ctor because we don't have our local copy yet
        // Access to Url 
        _foobarController.Url = Url;
        // Access to User
        _foobarController.ActionContext = ActionContext;
        // For more references see https://github.com/aspnet/Mvc/blob/6.0.0-rc1/src/Microsoft.AspNet.Mvc.ViewFeatures/Controller.cs
        // Note: This will change in RC2
    }

    public IActionResult Index()
    {
        InitControllers();

        var model = new IndexViewModel();
        model.Foo = _foobarController.List(new FoobarRequest() { Foo = true, Bar = false });
        model.Bar = _foobarController.List(new FoobarRequest() { Foo = false, Bar = true });
        return View(model);
    }
}

El código fuente para ASP.Net Core MVC6 RC1 Controller se puede encontrar aquí. Sin embargo, está experimentando una gran reescritura para RC2 y, con él, las propiedades que deben copiarse para obtener acceso a User y Url cambiarán.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *