2

オブジェクトの有効期間を管理するために 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」Ninjectモジュール:

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

私が理解しようとしているのは、何かを InRequestScope() にするように要求したときに、それが破棄されない理由です...何かアイデアはありますか?

4

2 に答える 2

5

InRequestScope()リクエストが終了したときに破棄されるオブジェクトを取得するには、 OnePerRequestHttpModule.

正直なところ、なぜ誰もが物事を難しい方法で行う必要があると感じているのか、私にはわかりません。nuget から Ninject.MVC3 をインストールするだけで、これらすべてが処理されます。私が目にする「助けてください。Ninject が本来の動作をしていません」という質問の 99.9% は、人々が困難な方法で物事を行う必要性を感じ、間違ったことをしているからです。

頭を悩ませてください。Ninject.MVC3 をインストールし、バインディングやモジュールを NinjectWebCommon.cs にコピーするだけで完了です。

于 2012-05-15T03:43:24.783 に答える
2

古いバージョンを使用しているか、Web 拡張機能をまったくロードしていないかのいずれかです。Ninject.Web.Common

于 2012-05-15T06:52:52.830 に答える