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
Vous devez vous connecter pour publier un commentaire.
Dans votre
Startup.cs
peut dire à la MVC pour enregistrer tous vos contrôleurs en tant que services.Alors vous pouvez simplement injecter le contrôleur désiré dans votre autre contrôleur via DI mécanisme et appeler sa méthode d'action.
OriginalL'auteur B12Toaster
Pour être en mesure d'utiliser un contrôleur à partir d'un autre contrôleur, vous devez:
services.AddTransient <Areas.Api.Controllers.FoobarController, Areas.Api.Controllers.FoobarController>();
Si vous avez besoin pour accéder à des propriétés locales dans le contrôleur comme
User
ouUrl
il y a deux façons de le faire.La première façon est d'utiliser des DI pour obtenir une instance de
IHttpContextAccessor
pour accéder àUser
etIUrlHelper
pour accéder àUrl
objets:La deuxième façon est de le mettre dans l'appel de contrôleur:
Le code source pour ASP.Net Core MVC6 RC1 Contrôleur peut être trouvé ici. Il est toutefois très lourd de réécriture pour la RC2 et, avec elle, les propriétés que doit être copié pour obtenir l'accès à l'Utilisateur et l'Url va changer.
CreateController
sur github.com/aspnet/Mvc/blob/...OriginalL'auteur Tedd Hansen
Ne pas le faire. Déplacer cette logique à un autre composant qui obtient partagé entre les 2 contrôleurs.
Utiliser l'injection de dépendance du système pour obtenir une instance de cette chose. Je ne vois pas pourquoi c'est un problème. Vous pouvez résoudre quoi que ce soit dans la programmation avec certains d'indirection 😀
Que diriez-système de plugin où vous n'avez pas accès à type au moment de la compilation? Disons que je suis de chargement contrôleur de l'extérieur de l'assemblée.
Utiliser le système de plugin directement au lieu d'utiliser MVC comme votre mécanisme de communication entre les plugins
J'ai dans cette situation où les deux contrôleurs ont dû faire des choses similaires, et que la solution que @davidfowl a dit est une fonction partagée sur une autre classe créée pour proposer des
OriginalL'auteur davidfowl
Pourquoi votre nouveau calque besoin de câblage? Pourquoi ne pas prendre un objet dans les deux contrôleurs et appeler une méthode sur un objet. Le conteneur d'injection de dépendances, pourrait résoudre les dépendances de ce nouvel objet sans double câblage ne pourrait-elle pas?
ie vous pourriez avoir ce:
//Répétez cette procédure pour l'API contrôleur
OriginalL'auteur Sam Holder