J'essaie d'utiliser Ninject pour gérer la durée de vie des objets. Pour mon objet IRepository, je demande à ce que IDisposable soit implémenté, et dans le ConcreteRepository, j'ai implémenté IDisposable pour tuer mon NHibernateSession. Mon problème est que je mets aussi une variable statique dans le ConcreteRepository pour compter le nombre d'instanciations et de destructions/dispositions de ConcreteRepository ... quand j'exécute l'application, je n'ai plus de connexions à la base de données, et mon journal montre que mon application ne libère jamais mes connexions.Ninject 3.0 ne dispose pas d'objets mappés comme InRequestScope
Mon 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;
}
}
Module contrôleur Mon que j'utilise pour tester avec:
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();
}
}
Mon "NHibernate" Module Ninject:
public class DataObjectsNHibernateModule
: NinjectModule
{
public override void Load()
{
Bind<ISessionFactory>().ToProvider<NHibernateSessionProvider>().InSingletonScope();
Bind<IRepository>().To<NHibernateRepository>().InRequestScope();
}
}
Qu'est-ce que J'essaie de comprendre pourquoi quand je demande que quelque chose soit InRequestScope(), il n'est pas disposé ... des idées?
On peut passer ISessionFactory à mon dépôt au lieu de passer ISession à mon dépôt ... toujours à la recherche en elle. http://vault13.co.uk/ninject-mvc3-and-web-requests/ –