2017-09-23 1 views
2

J'ai une classe existante qui nécessite un constructeur sans paramètre. Je veux enregistrer une erreur et d'autres données de l'intérieur. Partout ailleurs dans mon application, j'ai mis le ILoggerFactory dans mon constructeur et DI s'en occupe et ainsi je peux me connecter et ainsi de suite. Je ne peux pas faire cela dans ce cas à cause de l'exigence du constructeur sans paramètre. Puis-je créer une instance du ILoggerFactory ou de toute autre classe que j'ai ajoutée au flux Injection de dépendances de ma classe de démarrage?Comment instancier une ILoggerFactory sans utiliser Dependency Injection?

+4

Pour des situations comme celle-ci, vous devez enregistrer une classe de fabrique pour votre classe existante. Faites-le construire la classe puis définissez une propriété publique ou appelez une méthode publique pour injecter ILogger. –

+0

Comment utilisez-vous la classe? Pouvez-vous définir une propriété publique pour ILoggerFactory? Et définir cette propriété de l'extérieur de la classe? – Nikolaus

+0

@Nikolaus Je prévois de réécrire la classe pour ne pas être si autonome et je peux obtenir une ILoggerFactory. – Grandizer

Répondre

2

Dans Configure (dans Startup.cs), IApplicationBuilder est transmis, avec une propriété ApplicationServices (IServiceProvider).

Vous pouvez facilement faire quelque chose comme

public void Configure(IApplicationBuilder app) 
{ 
    GetMeSomeServiceLocator.Instance = app.ApplicationServices; 
} 

public static class GetMeSomeServiceLocator 
{ 
    public static IServiceProvider Instance { get; set; } 
} 

, puis plus tard, quelque part tout à fait sans rapport, ne

public void SomeRandomMethod() 
{ 
    var service = GetMeSomeServiceLocator.Instance.GetService<MyAwesomeService>(); 

    // Do something with service 
} 

Il est un anti-modèle horrible, et vous ne devriez jamais faire cela, cependant.

Sans vergogne volé de https://github.com/aspnet/DependencyInjection/issues/294 (de sorte que ce serait là pour la postérité).

+0

J'ai implémenté ce que vous avez demandé et je l'appelle comme: 'var lf = ServiceInstantiator.Instance.GetService ();' mais en obtenant l'erreur 'La méthode non générique IServiceProvider.GetService (Type) ne peut pas être utilisée avec des arguments de type '. Cependant, ce 'var lf = ServiceInstantiator.Instance.GetService (typeof (ILoggerFactory))' compile mais je ne peux pas faire: 'lf.CreateLogger ();' – Grandizer

+0

@Grandizer vous devez ajouter 'comme ILoggerFactory' avant'; – Nikolaus

+2

C'est probablement un cas d'instruction using manquante, les méthodes GetService <> sont en fait des méthodes d'extension. –