2016-08-05 3 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; 
    } 

내 자신의 클래스 :

위의 MyClass의에서
Public class MyClass : IMyClass 
{ 
    ITransportHeartbeat _heartbeat; 
    IClientListDao _clientList; 

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

, Ninject에이 IClientDao의 객체를 주입 그러나 ITransportH를 위해 아닙니다 귀걸이. 이 인터페이스는 기본 리졸버에 의해 수행되므로이 ​​인터페이스를 바인딩하지 않습니다. 내가 여기서 뭘 잘못하고 있니? 기본 해석기가 ITransportHeartbeat에 대한 객체를 삽입하지 않는 이유는 무엇입니까?

답변

0

내가 수동으로 startup.cs에 ITransportHeartbeat를 해결 결국 : 내가 제대로 이해한다면

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

, ITransportHeartbeat은 기본 종속성 리졸버에 의해 해결됩니다. 따라서 생성자 arguements를 전달하지 않고 kernel.Get<IMyClass>()을 수행하면 Ninject는 IClientListDao을 해결하고 기본 종속성 해결 프로그램은 ITransportHeartbeat을 해결합니다. 그러나 후자는 해결되지 않습니다.