オブジェクトの有効期間を管理するために 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() にするように要求したときに、それが破棄されない理由です...何かアイデアはありますか?