2016-08-05 15 views
0

Wir verwenden Ninject als DI-Container für Signalr. Ich kann nicht die ITransportHeartbeat in eine meiner Klassen injiziert bekommen. Ich verwende diese Schnittstelle, um die Client-Präsenz zu verwalten, wie von Signalr empfohlen.SignalR Abhängigkeit Resolver Problem mit Ninject

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

Meine benutzerdefinierte Ninject Bindungen:

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

Meine eigene Klasse:

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

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

In MyClass oben Ninject spritzt das Objekt für IClientDao aber nicht für ITtransportH Ohrfeigen Ich verbinde diese Schnittstelle nicht mit irgendetwas, da dies vom Standard-Resolver erledigt wird. Was mache ich hier falsch? Warum injiziert der Standard-Resolver kein Objekt für den ITransportHeartbeat?

Antwort

0

landete ich die ITransportHeartbeat in startup.cs manuell lösen up:

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

Wenn ich es richtig verstehe, ist ITransportHeartbeat durch die Standard Abhängigkeitsauflöser aufgelöst. Wenn ich also kernel.Get<IMyClass>() mache, ohne irgendwelche Konstruktorargumente zu übergeben, würde Ninject den IClientListDao auflösen und der Standardabhängigkeitsresolver löst den ITransportHeartbeat auf. Letzteres ist jedoch nicht gelöst.