2016-08-05 5 views
0

Мы используем Ninject как контейнер DI для Signalr. Кажется, я не могу ввести ITransportHeartbeat в один из моих классов. Я использую этот интерфейс для управления присутствием клиента, как это рекомендовано Signalr.Проблема с преобразователем зависимостей SignalR с 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>(); 
    } 

Мои пользовательские 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. Но последнее не разрешено.

Смежные вопросы