ASP.Net Core Appeler un contrôleur à partir d'un autre contrôleur

Dans mon ASP.Net Core, MVC 6 solution j'ai deux séries de contrôleurs. Un ensemble contient les pages web à leurs vues. Un autre set contient les contrôleurs d'API.

Pour éviter de dupliquer les db logique du web contrôleurs à l'aide de l'API de contrôleurs. Actuellement, je suis entrain de créer une instance du contrôleur requis manuellement en le donnant un DbContext comme argument du constructeur. C'est le DbContext donné de contrôle web par l'injection de dépendance.

Mais à chaque fois que j'ajoute un autre paramètre du constructeur de l'API contrôleur j'ai besoin de modifier tous les contrôleurs qui utilisent cette API contrôleur.

Comment puis-je utiliser l'injection de dépendance du système intégré de ASP.Net 5 pour créer une instance de l'API requis contrôleur pour moi? Ensuite, il serait de remplir le constructeur automatiquement les paramètres.

Une solution pourrait être de déplacer le db logique à partir de l'API contrôleurs à un calque distinct et l'appeler à partir à la fois de l'API et web contrôleurs. Cela ne résoudrait pas mon problème depuis la nouvelle couche, encore faudrait-il les mêmes paramètres et je ne suis pas fan de la inutile de câblage.

Une autre solution serait d'avoir le web contrôleurs d'accès de l'API par le biais d'un appel web, mais cela ajoute à la complexité de l'application.

Aujourd'hui, je suis en train de faire ceci:

public IActionResult Index()
{
    using (var foobarController = new Areas.Api.Controllers.FoobarController(
        //All of these has to be in the constructor of this controller so they can be passed on to the ctor of api controller
        _dbContext, _appEnvironment, 
        _userManager, _roleManager, 
        _emailSender, _smsSender))
    {
        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);
    }
}

Et je suis en espérant quelque chose comme ceci:
(Cet exemple ne fonctionne pas.)

using (var foobarController = CallContextServiceLocator.Locator.ServiceProvider.GetService<Areas.Api.Controllers.FoobarController>())
{
    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);
}

OriginalL'auteur Tedd Hansen | 2016-01-23