2016-05-17 68 views
0

无法解析服务实例这是我ConfigureServices方法的一部分:ASP.NET核心:通过CallContextServiceLocator.Locator.ServiceProvider

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 

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

    ... 

} 

我试图解决IRouteMessages接口的实例在我RegisterCommandHandlersInMessageRouter类:

public class RegisterCommandHandlersInMessageRouter 
{ 
    ... 

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

    ... 

} 

router变量始终为空。然而在我的控制器中,IRouterMessages自动解析(在构造函数中),一切都很好。

我不确定我的代码的其他部分可能有用。我会提供更多细节。

回答

1

不要EVER使用CallContextServiceLocator,这完全击败了依赖注入的目的。和从不中继。

CallContextServiceLocator仅用于某些内部ASP.NET核心,永远不应该被创建ASP.NET Core应用程序的开发人员使用。这就是说,它可以在任何时候被删除,内部或不可访问,这将破坏现有的应用程序。

此外,CallContextServiceLocator仅注册了运行时服务(DNX服务,反正不赞成使用)。来源:来自ASP.NET Core团队的David Fowl

Infact CallContextServiceLocator在RC2中被删除,请参阅announcement

  1. 删除了对CallContextServiceLocator的支持。改为使用PlatformServicesCompilationServices

相反,只能使用内置的依赖注入,像这样:

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); 
    } 

    ... 

} 

,并调用它在你的Startup.cs

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