2012-05-15 5 views
2

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?

+0

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/ –

Répondre

5

Afin que les objets InRequestScope() soient éliminés lorsque la requête est terminée, vous devez charger le OnePerRequestHttpModule. Honnêtement, je ne sais pas pourquoi tout le monde ressent le besoin de faire les choses à la dure. Il suffit d'installer Ninject.MVC3 de Nuget et il prend soin de tout cela pour vous. 99,9% du «s'il vous plaît aidez-moi, Ninject ne fait pas ce qu'il est censé» les questions que je vois sont parce que les gens ressentent le besoin de faire les choses à la dure et ils le font mal.

Épargnez-vous un peu de mal de tête. Il suffit d'installer Ninject.MVC3 et de copier vos liaisons et/ou modules vers NinjectWebCommon.cs et vous avez terminé.

+1

Alors que vous pouvez être factuellement correct c'est plutôt dur. – blowdart

+2

@blowdart - Qu'est-ce qui est dur? C'est la façon difficile de le faire, et vous vous tromperez probablement si vous ne savez pas ce que vous faites. Ninject.MVC3 est le moyen facile, et vous l'avez compris, et il faut quelques secondes pour l'installer. –

+0

Il a fini par être dans mon NHibernateMoudle ... remarquez que je ne lie pas ISession à quoi que ce soit ... Je poussais ISessionFactory dans mon Repository, et il ne se débarrassait jamais de là. Il suffit de lier ISession à une méthode qui a obtenu le ISessionFactory.OpenSession(), et de pousser ISession dans l'usine a résolu les problèmes. Je l'ai fait via Global uniquement parce que j'ai rencontré des problèmes avec le paquet Ninject.MVC3 dans le passé, et j'essayais de corriger ces problèmes au cas où ils seraient toujours là. –

2

Soit vous utilisez une ancienne version ou vous n'avez pas chargé l'une des extensions web avec Ninject.Web.Common

+0

non. voir mon commentaire à Mystere Man. –

Questions connexes