2011-02-28 20 views
24

से बाहर ऑब्जेक्ट्स पर निपटान मुझे आश्चर्य हुआ कि निनजेक्ट द्वारा बनाई गई मेरी कम से कम एक वस्तु अनुरोध के अंत में निपटाई नहीं गई है, जब इसे इनरक्वैस्टस्कोपनिंजा कॉल नहीं करता है जब स्कोप

के रूप में परिभाषित किया गया है

यहाँ वस्तु मैं निपटान के लिए कोशिश कर रहा हूँ है:

इंटरफ़ेस:

public interface IDataContext : IDisposable 
{ 
    MessengerEntities context { get; set; } 
} 

MessengerEntities ObjectContext की इकाई की रूपरेखा का क्रियान्वयन है - मेरी संदर्भ वस्तु।

तो मैं तो जैसे एक ठोस वर्ग बनाने के लिए:

public class DataContext : IDataContext 
{ 
    private MessengerEntities _context = new MessengerEntities(); 
    public MessengerEntities context 
    { 
     get 
     { 
      return _context; 
     } 
     set 
     { 
      _context = value; 
     } 
    } 
    #region IDisposable Members 

    public void Dispose() 
    { 
     context.Dispose(); 
    } 

    #endregion 
} 

और फिर मैं तो जैसे एक Ninject नियंत्रक कारखाना (इस स्टीव सैंडरसन MVC 2 किताब पर आधारित है) है:

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    // a Ninject "kernel" is the thing that can supply object instances 
    private IKernel kernel = new StandardKernel(new MessengerServices()); 

    // ASP.NET MVC calls this to get the controller for each request 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
      return null; 
     return (IController)kernel.Get(controllerType); 
    } 

    private class MessengerServices : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IDataContext>().To<DataContext>().InRequestScope(); 
      Bind<IArchivesRepository>().To<ArchivesRepository>().InRequestScope(); 
      Bind<IMessagesRepository>().To<MessagesRepository>().InRequestScope(); 
     } 
    } 
} 

अब, जब मैं संदर्भ में कॉल पर ब्रेकपॉइंट डालता हूं। DataContext ऑब्जेक्ट में() को डिस्प्ले करें (डीबगर चलाएं, वह कोड कभी निष्पादित नहीं होता है।

तो, सबूत बताते हैं कि जब निदान से बाहर निकलते हैं तो निनजेक्ट वस्तुओं का निपटान नहीं करता है, लेकिन केवल नई वस्तुओं को बनाता है और कचरा कलेक्टर पर निर्भर करता है ताकि वे इसे चुनने के समय से छुटकारा पा सकें।

मेरा प्रश्न है: क्या मुझे इसके बारे में चिंतित होना चाहिए? क्योंकि मैं हूं - मुझे लगता है कि निनजेक्ट किसी भी ऑब्जेक्ट का निपटान करेगा जो IDISposable लागू करता है।

अद्यतन: मैं (MVC 3 के लिए) Ninject Mvc एक्सटेंशन डाउनलोड किया है और यह अब मैं MvcApplication और बाध्यकारी कैसे कर रहा हूँ, और यह मेरी संदर्भ वस्तु के निपटान हो रहे है।

Global.asax में:

public class MvcApplication : NinjectHttpApplication 
{ 
    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 StandardKernel(); 
     kernel.Load(Assembly.GetExecutingAssembly()); 
     return kernel; 
    } 

    protected override void OnApplicationStarted() 
    { 
     base.OnApplicationStarted(); 
     AreaRegistration.RegisterAllAreas(); 
     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 

और

public class EFBindingModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IDataContext>().To<DataContext>().InRequestScope(); 
     Bind<IArchivesRepository>().To<ArchivesRepository>().InRequestScope(); 
     Bind<IMessagesRepository>().To<MessagesRepository>().InRequestScope(); 
    } 
} 

बाकी सब कुछ एक ही रहता है।

उत्तर

15

निदान आपके ऑब्जेक्ट्स को जीसी द्वारा अनुरोध ऑब्जेक्ट के रूप में जल्द ही निपटान करेगा। लेकिन आम तौर पर इसमें कुछ समय लगता है। लेकिन अनुरोध समाप्त होने के तुरंत बाद निपटान करने का एक तरीका है। सबसे अच्छा तरीका है अपने खुद के नियंत्रक फैक्ट्री को लागू करने के बजाय Ninject.Web.MVC http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ का उपयोग करना। दूसरा तरीका OnePerRequestModule का उपयोग करने के लिए अपने एप्लिकेशन को कॉन्फ़िगर करना है।

+4

बहुत बढ़िया, मुझे लगता है कि यह काम कर रहा है! मुझे पूरा यकीन नहीं है कि कैसे - लेकिन मैंने निनजेक एमवीसी 3 एक्सटेंशन को डाउनलोड किया, ग्लोबल.एक्सएक्स में विस्तारित निनजेक्ट एचटीपी एप्लीकेशन, और मेरी बाइंडिंग और वॉयला को परिभाषित करने के लिए निनजेक मॉड्यूल से ली गई एक कक्षा बनाई, अब यह मेरे डेटा कॉन्टेक्स्ट क्लास पर निपटान कर रहा है। (मैं जो कोड मैं अपने प्रश्न में उपयोग कर रहा हूं उसे जोड़ दूंगा और अगर आप अभी भी सही नहीं कर रहे हैं तो आप मुझे बता सकते हैं।) धन्यवाद! – Cynthia

+2

मैं 'Ninject.Web.MVC4' और मेरा 'IDataContext' का उपयोग कर रहा हूं जो' InRequestScope() 'का निपटारा नहीं किया जा रहा है। मैन्युअल रूप से ' 'system.web/httpModules' में जोड़ा गया है और यह या तो काम नहीं कर रहा है। कोई सुझाव? – epalm

+3

अजीब। जीसी पर निपटान मेरे लिए उद्देश्य की हार की तरह लगता है। निंजा प्रलेखन क्यों होगा (https://github.com/ninject/ninject/wiki/Object-Scopes) विज्ञापन अनुरोध के अंत पर निपटें यदि ऐसा नहीं करता है? – Stilgar

संबंधित मुद्दे