0
votes

Attribut de filtre avec injection de dépendance

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? XXX PRE>

Classe de démarrage P>

namespace Projects.Controllers
{
    [CompanyFilter]
    public class HomeController : Controller
    {
....


16 commentaires

J'écrirais le filtre de sorte que ce qui est injecté n'est pas iconfiguration 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 n'importe où. Vous devriez plutôt suivre la convention et l'injection ioptions dans votre CompanyFilter . Utilisez services.configure (configuration.getection ("SectionName")); dans votre démarrage.cs où t 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 et résolu à l'aide de ServiceFilterAttribute (type)


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 ou non, vous aurez accès au actionExecutingContext , peu importe, car c'est un détail attaché au actionfilterattribute classe de base. Si c'est global, utilisez ensuite la surcharge addmvc pour configurer la collection Filtres .


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))] . Ensuite, aussi longtemps que YourFilterType est enregistré au conteneur, il est exécuté.


3 Réponses :


0
votes

Je vous suggère d'utiliser ioptions pour récupérer la configuration à partir d'un fichier avec tous les avantages pris en charge par .NET CORE. Vous pouvez voir comment faire ici .

Aussi, pour l'injecter à la dépendance à la dépendance Résolution d'injection Ajouter Services.Ajouter (P => Nouveau Myservice (MySettings)); à votre ConfigureServices () fonctionne comme transitoire ou Scoped ou Singleton (décidez lequel vous vous convient mieux).

Si vous insistez sur l'utilisation de iconfiguration pour récupérer la configuration et résoudre le problème que vous avez obtenu, vous devez injecter votre iconfiguration instance similaire à celui-ci services.addsingleton (configuration ); . J'espère que cela résout votre problème.


3 commentaires

Cela ne répond pas, ou mettez en surbrillance la nécessité d'utiliser ServiceFilterAttribute (type) 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 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 / ...



0
votes

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));
}


0 commentaires

0
votes

Pour fournir une réponse basée sur les commentaires fournis hier par d'autres et moi-même, il est recommandé d'injecter ioptions code> dans vos filtres ou tout autre objet nécessitant des données de configuration à injecter.

Vous pouvez ajouter vos paramètres ERP à votre fichier appsettings.json comme SO P> xxx pré>

pour injecter vos paramètres dans des dépendances que vous devez l'enregistrer via 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> xxx pré>

Pour appliquer votre filtre sur votre action de contrôleur, utilisez ServiceFilterAttribute (type) ` 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;
    }
}


0 commentaires