Мы используем 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?