1

J'ai quelques attributs de méthode qui enregistrent. Notre code de journalisation se trouve derrière une interface (ILog) et j'aimerais que les attributs dépendent uniquement de cette interface plutôt que d'une implémentation. Cela ne concerne pas vraiment la testabilité ou l'inversion des dépendances, mais plutôt le nettoyage du couplage des composants.Injection de dépendances et attributs .NET

Un exemple serait où nous avons une bande (Mvc) d'attribut spécifique comme suit:

HandleExceptionAttribute : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext context) 
    { 
     LogFactory.CreateInstance().Info("message here", "log entry type"); 
    } 
} 

LogFactory dépend de la mise en œuvre concrète Log.cs. Cela a malheureusement pour effet de coupler ma DLL Web à la DLL contenant l'implémentation concrète, ce qui rend le système global plus rigide et plus fragile.

Tout autre endroit où une telle dépendance devient apparente, nous utilisons simplement notre conteneur IOC pour l'injecter. C'est exactement ce que j'aimerais faire maintenant avec l'attribut mais je ne suis pas vraiment sûr de savoir comment! Donc, ma question est: comment une dépendance concrète peut-elle être injectée dans un attribut .NET Framework derrière une interface (de préférence via un conteneur IOC comme StructureMap - mais tout ce qui fonctionne ira bien)?

Répondre

1

Pourriez-vous pas l'enregistreur une interface et passer soit une propriété dans l'attribut ou par le constructeur:

LoggerAttribute 
{ 
    [Dependency] 
    public ILogger Logger {get; set;} 

    ... 
} 

Si elle était moi si je pencherais pour mettre l'enregistreur dans une classe de base et mettre en place une propriété sur elle.

+0

Ceci est probablement la route que je vais finir par prendre - j'ai juste besoin de comprendre l'injection en utilisant les attributs et StrucuteMap ... –

+0

J'ai rencontré le même problème, j'ai choisi d'utiliser une propriété à la place des arguments constructeur car les attributs ne supportent que les valeurs constantes lorsqu'ils sont appliqués aux types. Donc, je ne pense pas que l'utilisation d'arguments constructeur soit une option, lorsqu'elle est utilisée sur des attributs (sauf si vous injectez des valeurs constantes). –

4

Voir cet article - Comment utiliser Ninject pour injecter des dépendances dans ASP.NET MVC ActionFilters

http://codeclimber.net.nz/archive/2009/02/10/how-to-use-ninject-to-inject-dependencies-into-asp.net-mvc.aspx

+0

C'est vraiment sympa - je n'utilise pas Ninject (StructureMap est mon CIO de choix) mais le même principe devrait s'appliquer parfaitement avec n'importe lequel des principaux conteneurs - outrepassant l'ActionInvoker est quelque chose dont j'ai besoin d'apprendre plus sur ... Cheers , –