我在 WebForms 应用程序中使用 Ninject。我有适用于应用程序不同部分的 NinjectConfiguration 模块。
所有绑定都设置为“InRequestScope”绑定。但是,在运行应用程序时,每次调用Kernel.Get<T>()
都会返回一个新实例。
我在 Global.asax 中使用以下代码:
public class Global : NinjectHttpApplication
{
public static IKernel SharedKernel { get; private set; }
protected override Ninject.IKernel CreateKernel()
{
SharedKernel = new StandardKernel();
// I have added these two lines to resolve an exception about IntPtr
SharedKernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
SharedKernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
SharedKernel.Load(new NinjectDataLayerConfiguration());
return SharedKernel;
}
}
我的忍者模块:
public class NinjectDataLayerConfiguration : NinjectModule
{
public override void Load()
{
Bind<EFContext>().ToSelf().InRequestScope();
Bind<IProjectRepository>().To<ProjectRepository>().InRequestScope();
/* other repositories */
}
}
在 Web.Config 中,我添加了一个 HttpModule 以确保在请求结束时处理这些项目:
<add name="OnePerRequestModule" type="Ninject.OnePerRequestModule" />
但是当我运行以下代码时:
var ProjectRepository1 = SharedKernel.Get<IProjectRepository>();
var ProjectRepository2 = SharedKernel.Get<IProjectRepository>();
我得到了两个不同的实例,这导致了各种错误(因为我使用的是实体框架并且我的 ObjectContext 应该通过请求共享)。
关于我做错了什么的任何指示?