2017-09-13 3 views
0

Ich arbeite mit einer ASP.Net Core Webanwendung und die typische Registrierungsmethode in der Startup.cs-Klasse verwenden, um meine Dienste zu registrieren.ASP.Net Core Ruft Dienste von DI-Container

Ich muss auf die registrierten Dienste in der IServiceCollection zugreifen, um über sie zu iterieren, um eine bestimmte Dienstinstanz zu finden.

Wie kann dies mit dem ASP.Net Core DI Container gemacht werden? Ich muss dies außerhalb eines Controllers tun.

Unten ist ein Beispiel für das, was ich versuche zu tun. Beachten Sie, dass die All-Methode nicht auf dem ServiceCollection nicht vorhanden ist, ist das, was ich versuche herauszufinden:

public class EventContainer : IEventDispatcher 
{ 
    private readonly IServiceCollection _serviceCollection; 

    public EventContainer(IServiceCollection serviceCollection) 
    { 
     _serviceCollection = serviceCollection; 
    } 

    public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent 
    { 
     foreach (var handler in _serviceCollection.All<IDomainHandler<TEvent>>()) 
     { 
      handler.Handle(eventToDispatch); 
     } 
    } 
} 
+0

Ist es richtig, dass Sie 'IServiceCollection' im Konstruktor zu injizieren versuchen von' EventContainer', indem sie es in Ihrem DI-Container Registrierung? – larsbe

+2

Sie möchten es wirklich manuell zu iterieren - warum möchten Sie IServiceProvider nicht verwenden: serviceProvider.GetService >()? –

+0

Da meinem Event-Handler möglicherweise mehrere Typen zugeordnet sind. Wie EmailHandler, PushNotificationHandler, etc. –

Antwort

0

Nach viel Versuch Ende Fehler ich auf eine Lösung gekommen, also muss ich die Antwort meiner eigenen tun Frage der Scham. Die Lösung erwies sich als sehr einfach, aber nicht sehr intuitiv. Der Schlüssel ist BuildServiceProvider() GetServices() auf der ServiceCollection zu nennen.

public class EventContainer : IEventDispatcher 
{ 
    private readonly IServiceCollection _serviceCollection; 

    public EventContainer(IServiceCollection serviceCollection) 
    { 
     _serviceCollection = serviceCollection; 
    } 

    public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent 
    { 
     var services = _serviceCollection.BuildServiceProvider().GetServices<IDomainHandler<TEvent>>(); 

     foreach (var handler in services) 
     { 
      handler.Handle(eventToDispatch); 
     } 
    } 
} 
+1

BTW, könnten Sie dies durch direkte Injektion der IServiceProvider anstelle der IServiceCollection – Learner

Verwandte Themen