Ninject 3.0 не удаляет объекты, отображаемые как InRequestScope

Я пытаюсь использовать 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();
    }
}

Мой модуль Ninject "NHibernate":

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

Я пытаюсь понять, почему, когда я прошу, чтобы что-то было InRequestScope(), оно не удаляется... есть идеи?


person Richard B    schedule 15.05.2012    source источник
comment
Возможно, он передает ISessionFactory в мой репозиторий вместо передачи ISession в мой репозиторий... все еще изучает его. vault13.co.uk/ninject-mvc3-and-web-requests   -  person Richard B    schedule 15.05.2012


Ответы (2)


Чтобы получить InRequestScope() объекты, которые будут удалены после завершения запроса, вы должны загрузить файл OnePerRequestHttpModule.

Честно говоря, я не знаю, почему все чувствуют необходимость делать что-то трудным путем. Просто установите Ninject.MVC3 из nuget, и он позаботится обо всем этом за вас. 99,9% вопросов «пожалуйста, помогите мне, Ninject не делает то, что должен» я вижу, потому что люди чувствуют необходимость делать что-то трудным путем, и они делают это неправильно.

Избавьте себя от головной боли. Просто установите Ninject.MVC3 и скопируйте свои привязки и/или модули в NinjectWebCommon.cs, и все готово.

person Erik Funkenbusch    schedule 15.05.2012
comment
@blowdart - Что грубого? Это трудный способ сделать это, и вы, вероятно, ошибетесь, если не знаете, что делаете. Ninject.MVC3 — это простой способ, и вы понимаете его правильно, а установка занимает секунды. - person Erik Funkenbusch; 15.05.2012
comment
Он оказался в моем NHibernateMoudle... обратите внимание, как я ни к чему не привязываю ISession... Я помещал ISessionFactory в свой репозиторий, и он никогда не удалялся оттуда. Простая привязка ISession к методу, который получил ISessionFactory.OpenSession(), и добавление ISession в фабрику решили проблемы. Я сделал это через Global только потому, что в прошлом у меня были проблемы с пакетом Ninject.MVC3, и я пытался исправить эти проблемы, если они все еще существуют. - person Richard B; 15.05.2012
comment
@RichardB - о каких проблемах вы говорите? Я был бы более склонен решать проблемы, чем использовать обходной путь. Ninject3 значительно изменил принцип работы. - person Erik Funkenbusch; 15.05.2012
comment
@MystereMan, другими словами ... в какой-то момент у меня все работало с использованием Global, я перешел на использование пакета MVC3, и он заработал после решения нескольких проблем PEBCAK, но заметил эту одну проблема, так что я откатился назад, проблема все еще была, и, наконец, выяснилось, что это было из-за того, что я вводил не ту вещь в неправильную область... честно говоря, я могу просто вернуть класс активации Ninject.MVC3 обратно в смешать и вернуть мой Global.asax.cs обратно в HttpApplication... Это не такая уж большая проблема. Я могу просто сделать это в любом случае, потому что мне нравится модель развертывания nuget. - person Richard B; 16.05.2012
comment
Я использую Ninject.MVC4, добавил свои привязки к NinjectWebCommon.RegisterServices, а мой DbContext, который является InRequestScope(), по-прежнему не удаляется. Что бы я проверил в этот момент? - person epalm; 19.09.2014
comment
@epalm - Что заставляет вас думать, что его не утилизируют? - person Erik Funkenbusch; 19.09.2014

Либо вы используете старую версию, либо вы не загрузили ни одно из веб-расширений вместе с Ninject.Web.Common.

person Remo Gloor    schedule 15.05.2012