L'injection de dépendance avec un statique enregistreur, statique de la classe helper
J'ai une classe statique qui appelle une statique Enregistreur de classe,
e.g
static class DoesStuffStatic
{
public static void DoStuff()
{
try
{
//something
}
catch(Exception e)
{
//do stuff;
Logger.Log(e);
}
}
}
static class Logger
{
public static void Log(Exception e)
{
//do stuff here
}
}
Comment puis-je injecter de l'Enregistreur dans ma classe statique?
Remarque: j'ai lu L'Injection de dépendance dans la .NET avec des exemples?, mais ce qui semble utiliser une instance enregistreur.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas injecter un statique enregistreur. Vous devez soit changer en une instance de l'exploitant (si vous pouvez), ou de l'envelopper dans une instance enregistreur (qui appelle la statique). Aussi, il est assez difficile d'injecter quoi que ce soit à une classe statique (parce que vous ne contrôlez pas le constructeur statique en quelque sorte), c'est pourquoi j'ai tendance à passer tous les objets que je veux injecter des paramètres.
Ce n'est pas nécessairement le cas. Tant que votre statique enregistreur expose une méthode pour:
Voici un exemple. Prenez la classe suivante pour DI:
Et voici notre classe statique qui a besoin d'un enregistreur de:
Maintenant, dans un contexte mondial de démarrage de votre application (dans ce cas, dans mon global.asax.cs), vous pouvez instancier votre Conteneur d'injection de dépendances, puis à la main que pour une classe statique.
Et presto! Vous êtes maintenant en place et en cours d'exécution avec DI dans vos classes statiques.
Espère que ça aide quelqu'un. Je suis re-travailler une application qui utilise BEAUCOUP de classes statiques, et nous avons été à l'aide de ce succès pour un certain temps maintenant.
C'est un moyen très simple pour "injecter" la fonctionnalité d'une statique enregistreur.
Je ne suis pas sûr de savoir comment Logger fonctionne, mais en général, vous pouvez utiliser RequestService pour obtenir votre instance. Par exemple, dans la classe abstraite:
Il est possible de contrôleur, d'où vous pouvez accéder à HttpContext.
La deuxième façon est d'utiliser par exemple dans de Démarrage, où vous pouvez faire ceci:
où serviceCollection est IServiceCollection dotnet de Base.
Espère que cela a aidé.