से बाहर ऑब्जेक्ट्स पर निपटान मुझे आश्चर्य हुआ कि निनजेक्ट द्वारा बनाई गई मेरी कम से कम एक वस्तु अनुरोध के अंत में निपटाई नहीं गई है, जब इसे इनरक्वैस्टस्कोपनिंजा कॉल नहीं करता है जब स्कोप
के रूप में परिभाषित किया गया हैयहाँ वस्तु मैं निपटान के लिए कोशिश कर रहा हूँ है:
इंटरफ़ेस:
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();
}
}
बाकी सब कुछ एक ही रहता है।
बहुत बढ़िया, मुझे लगता है कि यह काम कर रहा है! मुझे पूरा यकीन नहीं है कि कैसे - लेकिन मैंने निनजेक एमवीसी 3 एक्सटेंशन को डाउनलोड किया, ग्लोबल.एक्सएक्स में विस्तारित निनजेक्ट एचटीपी एप्लीकेशन, और मेरी बाइंडिंग और वॉयला को परिभाषित करने के लिए निनजेक मॉड्यूल से ली गई एक कक्षा बनाई, अब यह मेरे डेटा कॉन्टेक्स्ट क्लास पर निपटान कर रहा है। (मैं जो कोड मैं अपने प्रश्न में उपयोग कर रहा हूं उसे जोड़ दूंगा और अगर आप अभी भी सही नहीं कर रहे हैं तो आप मुझे बता सकते हैं।) धन्यवाद! – Cynthia
मैं 'Ninject.Web.MVC4' और मेरा 'IDataContext' का उपयोग कर रहा हूं जो' InRequestScope() 'का निपटारा नहीं किया जा रहा है। मैन्युअल रूप से ' 'system.web/httpModules' में जोड़ा गया है और यह या तो काम नहीं कर रहा है। कोई सुझाव? –
epalm
अजीब। जीसी पर निपटान मेरे लिए उद्देश्य की हार की तरह लगता है। निंजा प्रलेखन क्यों होगा (https://github.com/ninject/ninject/wiki/Object-Scopes) विज्ञापन अनुरोध के अंत पर निपटें यदि ऐसा नहीं करता है? – Stilgar