2012-05-15 1 views
2

Ninject를 사용하여 객체의 수명을 관리하려고합니다. 내 IRepository 객체의 경우 IDisposable을 구현해야하며 ConcreteRepository에서는 NHibernateSession을 종료하기 위해 IDisposable을 구현했습니다.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

와 함께 웹 확장 중 하나를로드하지 않았습니다. http://vault13.co.uk/ninject-mvc3-and-web-requests/ –

답변

5

요청 완료시 InRequestScope() 개체를 삭제하려면 OnePerRequestHttpModule을로드해야합니다.

솔직히 모든 사람들이 어려운 일을해야 할 필요성을 느끼는 이유를 모르겠습니다. 그냥 Nugject에서 Ninject.MVC3을 설치하면 모든 것을 처리해줍니다. 99.9 %의 "도와주세요, Ninject가하고있는 일을하지 않습니다."라는 질문은 사람들이 어려운 일을해야 할 필요성을 느끼고 잘못했기 때문입니다.

두통을 덜어주세요. Ninject.MVC3를 설치하고 바인딩 및/또는 모듈을 NinjectWebCommon.cs로 복사하면 작업이 완료됩니다.

+1

실제로 다소 정확할 수도 있지만 다소 가혹합니다. – blowdart

+2

@blowdart - 가혹한가? 이것은 어려운 방법이며, 당신이 무엇을하고 있는지 모를 경우 아마 잘못 될 것입니다. Ninject.MVC3는 쉬운 방법이며, 올바르게 설치하면 설치하는 데 몇 초가 걸립니다. –

+0

그것은 내 NHibernateMoudle에 갇혀 ... 내가 어떻게 ISession을 바인딩하지 않는지 주목하라. ISessionFactory를 내 저장소에 넣고 있었는데, 거기에서 결코 폐기하지 못했다. 단순히 ISession을 ISessionFactory.OpenSession()이있는 메소드에 바인딩하고 ISession을 팩토리에 푸시하면 문제가 해결됩니다. 과거에 Ninject.MVC3 패키지로 문제가 발생했기 때문에 Global을 통해이 작업을 수행했습니다. 아직 해결되지 않았기 때문에 문제를 해결하려고했습니다. –

2

은 어느 당신은 이전 버전을 사용하거나 당신은 여전히 ​​그것으로 찾고 ... 내 저장소에 ISessionFactory를 전달하는 대신 내 저장소에 ISession을 통과 할 수있다 Ninject.Web.Common

+0

nope. Mystere Man에 대한 내 의견을 참조하십시오. –