2016-05-17 7 views
0

Dies ist Teil meiner ConfigureServices Methode:ASP.NET Kern: Es kann keine Dienstinstanz durch CallContextServiceLocator.Locator.ServiceProvider lösen

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 

    //bus 
    services.AddSingleton<IRouteMessages, MessageRouter>(); 
    services.AddSingleton<IBus, DirectBus>(); 
    //// 

    ... 

} 

Ich versuche, die Instanz von IRouteMessages Schnittstelle in meiner RegisterCommandHandlersInMessageRouter Klasse zu lösen :

public class RegisterCommandHandlersInMessageRouter 
{ 
    ... 

    public static void BootStrap() 
    { 
     var router = CallContextServiceLocator.Locator.ServiceProvider.GetService(typeof (IRouteMessages)); 
     new RegisterCommandHandlersInMessageRouter().RegisterRoutes(router as MessageRouter); 
    } 

    ... 

} 

router Variable ist immer null. Doch in meinen Controllern, wo IRouterMessages automatisch aufgelöst wird (in Konstruktoren) ist alles in Ordnung.

Ich bin mir nicht sicher, welche anderen Teile meines Codes könnten nützlich sein. Ich werde mehr Details zur Verfügung stellen.

Antwort

1

Do not EVER Verwenden Sie CallContextServiceLocator, dies übertrifft vollständig den Zweck der Abhängigkeit Injektion. Und NIE Relais darauf.

CallContextServiceLocator wird nur in einigen internen ASP.NET-Core verwendet und sollte nie von Entwicklern verwendet werden, die ASP.NET Core-Anwendungen erstellen. Das heißt, es kann jederzeit entfernt, intern oder unzugänglich gemacht werden, was bestehende Anwendungen zerstören würde.

Darüber hinaus hatte die CallContextServiceLocator nur Runtime-Dienste registriert (DNX Services, sowieso veraltet). Quelle: David Fowl von ASP.NET Core-Team.

Infact CallContextServiceLocator wird in RC2 entfernt, siehe announcement.

  1. entfernt Unterstützung für CallContextServiceLocator. Verwenden Sie stattdessen PlatformServices und CompilationServices.

Statt nur, verwenden Sie die eingebaute in Dependency Injection, wie folgt aus:

public static class RegisterCommandHandlersInMessageRouter 
{ 
    ... 
    // This is extension method now 
    public static void RegisterCommandHandlers(this IServiceProvider services) 
    { 
     var router = services.GetService(typeof (IRouteMessages)); 
     new RegisterCommandHandlersInMessageRouter().RegisterRoutes(router as MessageRouter); 
    } 

    ... 

} 

und nennen Sie es in Ihrem Startup.cs

public void Configure(IServiceProvider services) 
{ 
    ... 
    services.RegisterCommandHandlers(); 
    ... 
} 
Verwandte Themen