我有一个现有的MVC应用程序正在使用Ninject依赖注入。我安装了Ninject.MVC3 NuGet包,它在我的App_Start,这完全隔离的内核和注册所有我的绑定创建一个名为NinjectWebCommon类:Signalin 2依赖注入与Ninject
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
return kernel;
}
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IFoo>().To<Foo>();
}
我们有一些我们认为SignalR就能够了新的要求为了满足,所以我们在项目中安装了SignalR 2 nuget软件包。我创建了一个Hub并做了一些关于如何在项目中实现依赖注入的搜索,并找到了一篇建议创建SignalRDependencyResolver的文章。 http://www.asp.net/signalr/overview/signalr-20/extensibility/dependency-injection
文章有您创建的Startup.cs文件中的内核被用于OWIN注册SignalR:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var kernel = new StandardKernel();
var resolver = new NinjectSignalRDependencyResolver(kernel);
kernel.Bind<IStockTicker>()
.To<Microsoft.AspNet.SignalR.StockTicker.StockTicker>() // Bind to StockTicker.
.InSingletonScope(); // Make it a singleton object.
kernel.Bind<IHubConnectionContext>().ToMethod(context =>
resolver.Resolve<IConnectionManager>().GetHubContext<StockTickerHub>().Clients
).WhenInjectedInto<IStockTicker>();
var config = new HubConfiguration()
{
Resolver = resolver
};
app.MapSignalR(config);
}
}
的问题是,这种方法我创建了两个不同的内核,他们似乎有他们自己的一套依赖关系,他们知道如何解决。如果我在NinjectWebCommon中定义了依赖项,Hub不知道如何解决该依赖项。没有在NinjectWebCommon中公开我的内核,使用Ninject.MVC3包将DI添加到SignalR中的正确方法是什么?
我尝试将StockTickerHub添加到我的内核,但它有依赖关系,我不知道如何创建......特别是StockTicker类对IHubConnectionContext有依赖关系。本文解决了使用它的自定义SignalRDependencyResolver,但正如我在我的问题中所说的,我不知道如何集成这两个内核。 – Dismissile
Ninject将默认构建未绑定的具体类型,因此似乎手动添加Hub不是必需的:http://stackoverflow.com/questions/12398145/how-to-unbind-a-concrete-self-bound-singleton- bind-in-ninject-3#answer-12398187 – halter73
还是不回答我的问题。我不知道如何把这两块拼在一起。 Stock Ticker样本已经在Startup.cs中创建了一个内核,但我也在NinjectWebCommon中创建了一个内核,并且他们彼此不知道。 – Dismissile