우리는 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에 대한 객체를 삽입하지 않는 이유는 무엇입니까?