2016-08-05 24 views
0

我们使用Ninject作为Signalr的DI容器。我似乎无法将ITransportHeartbeat注入到我的一个类中。我使用这个接口来管理Signalr推荐的客户端存在。Ninject的SignalR依赖关系解析器问题

public class NinjectSignalRDependencyResolver : DefaultDependencyResolver 
    { 
     private readonly IKernel _Kernel; 

     public NinjectSignalRDependencyResolver(IKernel kernel) 
     { 
      _Kernel = kernel; 
     } 

     public override object GetService(Type serviceType) 
     { 
      return _Kernel.TryGet(serviceType) ?? base.GetService(serviceType); 
     } 

     public override IEnumerable<object> GetServices(Type serviceType) 
     { 
      return _Kernel.GetAll(serviceType).Concat(base.GetServices(serviceType)); 
     } 
    } 

Startup.cs

public void Configuration(IAppBuilder app) 
{ 
     var kernel = GetKernel(); 
     var resolver = new NinjectSignalRDependencyResolver(kernel); 
     var config = new HubConfiguration { Resolver = resolver } 
     GlobalHost.DependencyResolver = resolver; 
     GlobalHost.HubPipeline.AddModule(kernel.Get<ErrorModule>()); 
     app.MapSignalR(config); 

     var bootstrapper = new Bootstrapper(); 
     bootstrapper.Initialize(() => 
     { 
      return kernel; 
     }); 

     ///monitor1 is set to null 
     var monitor1=GlobalHost.DependencyResolver.Resolve<IMyClass>(); 
     //monitor2 is set to null 
     var monitor2=_kernel.Get<IMyClass>(); 
    } 

我自Ninject绑定:

private IKernel GetKernel() 
    { 
     if (_kernel != null) return _kernel; 
     var kernel = new StandardKernel(); 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 
     kernel.Load(new HubModule()); 
     kernel.Load(new LogModule()); 
     kernel.Load(new DaoModule()); 
     return kernel; 
    } 

我自己的类:

Public class MyClass : IMyClass 
{ 
    ITransportHeartbeat _heartbeat; 
    IClientListDao _clientList; 

    MyClass(IClientListDao clientList, ITransportHeartbeat heartbeat) 
    { 
     _hearbeat=heartbeat; 
     _clientList=clientList; 
    } 
    . 
    . 
    } 

在上述MyClass的,Ninject注入的对象IClientDao但不适用于ITransportH eartbeat。我没有将这个接口绑定到任何东西,因为这是由默认解析器完成的。我在这里做错了什么?为什么默认解析器不为ITransportHeartbeat注入一个对象?

回答

0

我结束了手动解决ITransportHeartbeat在startup.cs:

var myClass=kernel.Get<IMyClass>(
     new ConstructorArgument("heartbeat", resolver.Resolve<ITransportHeartbeat>())); 

如果我理解正确的话,ITransportHeartbeat由默认依赖解析器解析。所以当我做kernel.Get<IMyClass>()而不通过任何构造函数的争论时,Ninject会解析IClientListDao,而默认的依赖解析器解析ITransportHeartbeat。但后者没有解决。