J'essaie de bien comprendre les injections de dépendance. Je définit un filtre et je voudrais lire à partir d'un fichier de configuration. Est-ce une meilleure pratique d'instancier la configuration à l'intérieur du filtre ou peut-être être effectuée de manière globale, telle que dans le démarrage? Si tel est le cas, des pointeurs pour comment le faire? Classe de démarrage P> namespace Projects.Controllers
{
[CompanyFilter]
public class HomeController : Controller
{
....
3 Réponses :
Je vous suggère d'utiliser Aussi, pour l'injecter à la dépendance à la dépendance Résolution d'injection Ajouter Si vous insistez sur l'utilisation de ioptions
Services.Ajouter (P => Nouveau Myservice (MySettings)); Code> à votre
ConfigureServices () Code> fonctionne comme transitoire ou Scoped ou Singleton (décidez lequel vous vous convient mieux). P>
iconfiguration code> pour récupérer la configuration et résoudre le problème que vous avez obtenu, vous devez injecter votre
iconfiguration code> instance similaire à celui-ci
services.addsingleton (configuration ); code>. J'espère que cela résout votre problème. P>
Cela ne répond pas, ou mettez en surbrillance la nécessité d'utiliser ServiceFilterAttribute (type) code> pour appliquer le filtre à un contrôleur ou à une action afin de pouvoir injecter des dépendances.
La question concerne comment injecter iconfiguration ou tout autre moyen d'injecter des paramètres d'un fichier (dans ce cas Appssettings.json je suppose). Donc, cela n'a pas tellement d'importance c'est un filtre ou une autre classe que nous essayons d'injecter la configuration. Lisez la question correctement.
J'ai lu la propriété de questions, lisez mon commentaire correctement - pour injecter quelque chose dans un filtre, vous devez l'appliquer à une action ou contrôleur à l'aide du serviceTypeattribute code> après l'enregistrement du filtre dans la collection Services, n'a pas d'importance ce qui est injecté dans cette classe. docs.microsoft. COM / EN-US / ASPNET / CORE / MVC / Controllers / ...
basé sur certains des commentaires ici, ce qui suit est exécutif en ajoutant au démarrage.cs.
url = ... services.AddMvc(options => { options.Filters.Add(new ERPFilter(url)); }
Pour fournir une réponse basée sur les commentaires fournis hier par d'autres et moi-même, il est recommandé d'injecter Vous pouvez ajouter vos paramètres ERP à votre fichier appsettings.json comme SO P> pour injecter vos paramètres dans des dépendances que vous devez l'enregistrer via Pour appliquer votre filtre sur votre action de contrôleur, utilisez ServiceFilterAttribute (type) ` p > ioptions
configurevices code >, vous remarquerez également que
SociétéFilter CODE> est ajouté au
iservicecollection code> via
addtransient code>, il s'agit d'autoriser le service
ServiceFilterAttribute code > Pour le résoudre à une étape ultérieure et injecter toutes les dépendances, le filtre a. p>
public class CompanyFilter : ActionFilterAttribute
{
private readonly ErpSettings erpSettings;
public CompanyFilter(IOptions<ErpSettings> erpSettings)
{
this.erpSettings= erpSettings.Value;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.Controller is Controller controller)
controller.ViewBag.ERPUrl = erpSettings.Url;
}
}
J'écrirais le filtre de sorte que ce qui est injecté n'est pas
iconfiguration code> mais la valeur réelle, comme une URL, que la classe a besoin. C'est mieux pour la classe juste pour obtenir la dépendance dont elle a besoin, pas quelque chose qu'il doit inspecter. Si vous aimez, je peux fournir un exemple plus détaillé.
Je serais intéressé à voir ça.
Quel conteneur CIO utilisez-vous? Juste Microsoft.extensions.DePendencendencendencendencendencendencendencendencendencendency?
Standard ASP.NET CORE MVC?
Ok, par défaut qui est Microsoft.extensions.Dependencendencendencendencendencendency. Non liée: Depuis que vous avez mentionné, vous essayez d'apprendre de DI, je recommande vivement Cette vidéo . C'est ce qui a finalement fait "cliquer" pour moi et j'attribuerais une grande amélioration de la qualité de mon code à cette vidéo, menant finalement à plusieurs emplois de développeurs (et relance!). Je ne pense pas que cela répondra à votre question actuelle, mais j'espère que vous le trouverez aussi utile que moi.
Vous ne devriez pas injecter
iconfiguration code> n'importe où. Vous devriez plutôt suivre la convention et l'injection
ioptions code> dans votre
CompanyFilter code>. Utilisez
services.configure (configuration.getection ("SectionName")); code> dans votre démarrage.cs où
t code> est une classe qui est une représentation physique de votre objet JSON.
@Colinm Je ne suis pas sûr que l'injection de constructeur soit directement compatible avec les filtres d'action ASP.NET CORE MVC. Voir Cette question . Semble que vous devez soit faire du localisateur de service, soit de typeFilter. Je ne sais pas si cette situation s'est améliorée ou non. Je suis cependant d'accord cependant que IOPTIONS est bien meilleur que l'injection d'iconfiguration partout.
@ Mason Vous êtes correct, le filtre doit être enregistré dans la collection
Services Code> et résolu à l'aide de
ServiceFilterAttribute (type) code>
Ce n'est que le cas avec les filtres utilisés comme attributs, car les attributs ne peuvent pas être injectés de dépendances, car ils sont essentiellement instanciés en place. Si vous n'avez pas besoin du filtre pour être un attribut, vous pouvez utiliser une injection de dépendance.
Je pense que cela doit être un attribut car je souhaite définir globalement la vue ViewBag.
Si vous voulez que cela soit appliqué à chaque méthode d'action qui est appelée (c'est ce que «globalement» signifie), il n'a pas besoin d'être un attribut. Voir La documentation .
@ffejrekaburbb qui n'a pas de sens. Peu importe le style que vous utilisez,
attribut non> ou non, vous aurez accès au
actionExecutingContext code>, peu importe, car c'est un détail attaché au
actionfilterattribute code > classe de base. Si c'est global, utilisez ensuite la surcharge
addmvc code> pour configurer la collection code> Filtres CODE>.
Si vous avez besoin d'un attribut, vous pouvez utiliser un attribut passif. Le filtre est global, mais il vérifie si l'attribut est sur le contrôleur ou la méthode et n'exécute que si l'attribut est présent. Scotthannen.org/blog/2016/03/13/ ...
@Scotthannen bel exemple. Avez-vous envisagé de tourner cela dans un Q & A ici? Ensuite, nous pouvons uppouver et nous pouvons également l'utiliser pour fermer les doublons à l'avenir, le cas échéant.
@ Mason - bonne idée, je ferai ça ce soir.
En fait, il ressemble à ASP.NET CORE élimine la nécessité d'une approche d'attribut passive décrite dans mon poste de blog. Il vous permet de faire ceci:
[servicefilter (typeof (YourFilterType))] code>. Ensuite, aussi longtemps que
YourFilterType code> est enregistré au conteneur, il est exécuté.