【问题标题】:Ninject 3.0 is not disposing objects mapped as InRequestScopeNinject 3.0 不处理映射为 InRequestScope 的对象
【发布时间】:2012-05-22 13:20:39
【问题描述】:

我正在尝试使用 Ninject 来管理对象的生命周期。对于我的 IRepository 对象,我需要实现 IDisposable,并且在 ConcreteRepository 中,我已经实现了 IDisposable 来终止我的 NHibernateSession。

我的问题是我还在 ConcreteRepository 中放置了一个静态变量来计算 ConcreteRepository 的实例化和销毁/处置的数量......当我运行应用程序时,我与数据库的连接用完了,并且我的日志显示我的应用程序从未释放我的连接。

我的 Global.asax:

public class Global : NinjectHttpApplication
{
    protected override void OnApplicationStarted()
    {
        base.OnApplicationStarted();

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
        ControllerBuilder.Current.DefaultNamespaces.Add("WebPortal.Controllers");

        var log4netConfigFileInfo = new System.IO.FileInfo(Server.MapPath("~/log4net.xml"));

        log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netConfigFileInfo);
        log4net.ILog log = log4net.LogManager.GetLogger(typeof(Global));
        log.Info("Started...");
    }

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }


    protected override Ninject.IKernel CreateKernel()
    {
        var kernel = new Ninject.StandardKernel(
        new Utils.UtilsModule(),
        new Web.DataObjects.NHibernate.DataObjectsNHibernateModule(),
        new Payroll.PayrollModule(),
        new Web.DataObjects.DbModule()
        );

        kernel.Load(Assembly.GetExecutingAssembly());

        return kernel;
    }
}

我用来测试的控制器模块:

public class DatabaseAreaModelModule
    : NinjectModule
{
    public override void Load()
    {
        Bind<DiscountEdit>().ToSelf().InRequestScope();
        Bind<ItemCategoryEdit>().ToSelf().InRequestScope();
        Bind<ItemEdit>().ToSelf().InRequestScope();
        Bind<ModifierEdit>().ToSelf().InRequestScope();
        Bind<ModifierSetEdit>().ToSelf().InRequestScope();
        Bind<RevenueCenterEdit>().ToSelf().InRequestScope();
        Bind<RevenueClassEdit>().ToSelf().InRequestScope();
        Bind<TaxEdit>().ToSelf().InRequestScope();
    }
}

我的“NHibernate”忍者模块:

public class DataObjectsNHibernateModule
    : NinjectModule
{
    public override void Load()
    {
        Bind<ISessionFactory>().ToProvider<NHibernateSessionProvider>().InSingletonScope();
        Bind<IRepository>().To<NHibernateRepository>().InRequestScope();
    }
}

我想弄清楚为什么当我要求 InRequestScope() 时,它没有被处理...有什么想法吗?

【问题讨论】:

标签: c# asp.net-mvc-3 ninject ioc-container ninject.web.mvc


【解决方案1】:

为了在请求完成时得到InRequestScope()对象被释放,你必须加载OnePerRequestHttpModule

老实说,我不知道为什么每个人都觉得有必要以艰难的方式做事。只需从 nuget 安装 Ninject.MVC3,它就会为您处理所有这些。我看到的“请帮助我,Ninject 没有做它应该做的”问题的 99.9% 是因为人们觉得需要以艰难的方式做事,而他们做错了。

省去一些麻烦。只需安装 Ninject.MVC3 并将您的绑定和/或模块复制到 NinjectWebCommon.cs 即可。

【讨论】:

  • @blowdart - 什么是苛刻的?这是很难做到的,如果你不知道自己在做什么,你可能会弄错。 Ninject.MVC3 是一种简单的方法,而且你做对了,安装只需几秒钟。
  • 它最终出现在我的 NHibernateMoudle 中......注意我没有将 ISession 绑定到任何东西......我正在将 ISessionFactory 推入我的存储库,它从未从那里处理。只需将 ISession 绑定到获得 ISessionFactory.OpenSession() 的方法,然后将 ISession 推入工厂即可解决问题。我通过 Global 这样做只是因为我过去遇到了 Ninject.MVC3 包的问题,​​并且我试图纠正这些问题,以防它们仍然存在。
  • @RichardB - 你指的是什么问题?我更倾向于解决问题而不是使用解决方法。 Ninject3 极大地改变了工作方式。
  • @MystereMan,换句话说......在某一时刻,我使用 Global 进行了一些工作,转换为使用 MVC3 包,并且在解决了一些 PEBCAK 问题后它正在工作,但注意到这个一个问题,所以我回滚了,还是有问题,最后发现是因为我在错误的区域注入了错误的东西......老实说,我可以扔掉Ninject.MVC3 Activation 类重新加入其中,并将我的 Global.asax.cs 恢复为 HttpApplication... 这没什么大不了的。无论如何我都可以这样做,因为我喜欢 nuget 部署模型。
  • 我正在使用 Ninject.MVC4,将我的绑定添加到 NinjectWebCommon.RegisterServices 和我的 DbContext InRequestScope() 似乎仍然没有处理。此时我会检查什么?
【解决方案2】:

要么你使用的是旧版本,要么你没有加载任何网络扩展和Ninject.Web.Common

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2020-02-21
    • 2011-10-18
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多