2

我在 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 应该通过请求共享)。

关于我做错了什么的任何指示?

4

1 回答 1

2

您很可能不使用其中一种网络扩展。例如,对于 WebForms,Ninject.Web(除了 Ninject.Web.Common)

于 2012-07-30T07:47:06.217 回答