我有一个使用Ninject(NuGet安装)的ASP.NET MVC 3项目。我试图理解如何使用它将依赖项注入非MVC对象。
我有一些看起来类似于下面的代码。如何使用Ninject在下面的对象中获取IStore的具体实例?
public class SomeObject
{
private static IStore _store;
public static IStore CurrentStore
{
get
{
if (_store == null)
{
// Get Instance of _store.
}
return _store;
}
}
}
在Global.asax中:
protected Application_BeginRequest()
{
IStore store = SomeObject.CurrentStore;
}
在NinjectWebCommon.cs中:
private static void RegisterServices(IKernel kernel)
{
// Module that binds a concrete type of IStore.
kernel.Load<WebModule>();
}
答案 0 :(得分:1)
对于请求处理,最简单的方法不是在global.asax中,而是在IHttpModule中。在那里,如果为HttpModule添加绑定,则可以将依赖项作为构造函数参数:
Bind<IHttpModule>().To<MyHttpModule>();
答案 1 :(得分:0)
看起来这混淆了DI容器和放大器之间的界限。网络应用。
您可能需要的是一个检索商店的类。然后,该类可以决定从哪里实际检索商店。它还有一个初始化例程,可以在启动时调用。
这样,您的Ninject模块不会在其中获取Web应用程序代码,您可以根据上下文配置商店的加载方式(例如,测试可能与生产不同)。