2012-05-15 91 views
2

我试图使用Ninject来管理对象的生命周期。对于我的IRepository对象,我要求实现IDisposable,并且在ConcreteRepository中,我实现了IDisposable来杀死我的NHibernateSession。Ninject 3.0不处理映射为InRequestScope的对象

我的问题是,我也在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()的东西时,它不会被抛弃......任何想法?

+0

它可通过ISessionFactory到我的仓库,而不是传递的Isession到我的仓库......还在寻找到它加载任何网络扩展到一起。 http://vault13.co.uk/ninject-mvc3-and-web-requests/ –

回答

5

为了得到InRequestScope()当请求完成时要处理的对象,您必须加载OnePerRequestHttpModule

老实说,我不知道为什么每个人都觉得需要努力工作。只需从nuget安装Ninject.MVC3,并为您处理所有这些。 99.9%的“请帮助我,Ninject没有做它应该做的事情”。我看到的问题是因为人们觉得有必要以艰难的方式去做事,而他们做错了。

保存自己的一些头痛。只需安装Ninject.MVC3并将您的绑定和/或模块复制到NinjectWebCommon.cs,即可完成。

+1

虽然你可能是真实,正确那是相当严厉的。 – blowdart

+2

@blowdart - 什么苛刻?这是很难做到的,如果你不知道自己在做什么,你可能会错误的。 Ninject.MVC3是最简单的方法,并且您可以正确安装,并且需要几秒钟才能完成安装。 –

+0

它缠绕在我的NHibernateMoudle是......请注意,我怎么不具约束力的ISession的任何东西......我推ISessionFactory到我的仓库,这是从来没有从那里处置。简单地将ISession绑定到一个获得ISessionFactory.OpenSession()的方法,并将ISession推送到工厂中解决了这些问题。我是通过Global来做的,因为我过去遇到了Ninject.MVC3包的问题,​​并且我正在尝试纠正这些问题,以防他们仍然在附近。 –

2

无论您使用的是旧版本,或者你还没有Ninject.Web.Common

+0

nope。看到我对Mystere Man的评论。 –