2016-08-05 1 views
0

Nous utilisons Ninject comme un conteneur DI pour Signalr. Je ne peux pas sembler obtenir le ITransportHeartbeat injecté dans une de mes classes. J'utilise cette interface pour gérer la présence du client comme recommandé par Signalr.Problème de résolveur de dépendance SignalR avec 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>(); 
    } 

Mes personnalisés fixations 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; 
    } 

Ma propre classe:

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

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

Dans MyClass ci-dessus, l'objet Ninject INJECTE pour IClientDao mais pas pour ITransportH Eartbeat. Je ne lie pas cette interface à quoi que ce soit car cela est fait par le résolveur par défaut. Qu'est-ce que je fais mal ici? Pourquoi le résolveur par défaut n'injecte-t-il pas un objet pour ITransportHeartbeat?

Répondre

0

Je fini par résoudre manuellement le ITransportHeartbeat dans startup.cs:

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

Si je comprends bien, ITransportHeartbeat est résolu par le résolveur de dépendance par défaut. Donc, quand je fais kernel.Get<IMyClass>() sans passer les arguments du constructeur, Ninject résoudrait le IClientListDao et le résolveur de dépendance par défaut résout le ITransportHeartbeat. Mais ce dernier n'est pas résolu.