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)?
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 ... –
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). –