Wir verwenden Ninject als DI-Container für Signalr. Ich kann nicht die ITransportHeartbeat
in eine meiner Klassen injiziert bekommen. Ich verwende diese Schnittstelle, um die Client-Präsenz zu verwalten, wie von Signalr empfohlen.SignalR Abhängigkeit Resolver Problem mit 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>();
}
Meine benutzerdefinierte Ninject Bindungen:
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;
}
Meine eigene Klasse:
Public class MyClass : IMyClass
{
ITransportHeartbeat _heartbeat;
IClientListDao _clientList;
MyClass(IClientListDao clientList, ITransportHeartbeat heartbeat)
{
_hearbeat=heartbeat;
_clientList=clientList;
}
.
.
}
In MyClass oben Ninject spritzt das Objekt für IClientDao aber nicht für ITtransportH Ohrfeigen Ich verbinde diese Schnittstelle nicht mit irgendetwas, da dies vom Standard-Resolver erledigt wird. Was mache ich hier falsch? Warum injiziert der Standard-Resolver kein Objekt für den ITransportHeartbeat?