9

मेरी MVC 3 आवेदन में मैं Ninject उपयोग कर रहा हूँ और मेरी निर्भरता से एक इकाई की रूपरेखा पर है:निनजे + एएसपीनेट एमवीसी + इकाई फ्रेमवर्क - मेरा संदर्भ कब निपटाया जाता है?

interface IFooRepository 
{ 
    Foo GetFoo(int id); 
} 

public EFFooRepository : IFooRepository 
{ 
    private FooDbContext context; 

    public EFFooRepository(FooDbContext context) 
    { 
     this.context = context; 
    } 
} 

मैं इतना Ninject में की तरह एक बाध्यकारी की स्थापना की है, इसलिए यदि मैं एक से अधिक निर्भरता है और वे दोनों की जरूरत एक डेटा संदर्भ वे एक ही संदर्भ साझा करना समाप्त करते हैं:

Bind<FooDbContext>().ToSelf().InRequestScope(); 

मुझे पता नहीं है कि मेरे संदर्भ का निपटारा कब किया जाएगा। चूंकि मैं इसे तत्काल नहीं करता हूं, क्या कभी इसे निपटान किया जाएगा या जब यह कचरा इकट्ठा किया जाता है तो इसका निपटान किया जाएगा? निनजेक्ट को इसके साथ किए जाने पर कुछ भी निपटाने के बारे में पता है?

उत्तर

11

यदि FooDbContextIDisposable लागू करता है, तो निनजेक्ट अनुरोध के अंत में Dispose विधि स्वचालित रूप से कॉल करेगा।

यहाँ कैसे आप इसे सत्यापित कर सकते हैं:

public interface IFooRepository 
{ 
} 

public class FooDbContext: IDisposable 
{ 
    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class EFFooRepository : IFooRepository 
{ 
    private FooDbContext _context; 

    public EFFooRepository(FooDbContext context) 
    { 
     _context = context; 
    } 
} 

public class HomeController : Controller 
{ 
    private readonly IFooRepository _repo; 

    public HomeController(IFooRepository repo) 
    { 
     _repo = repo; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
:

  1. Ninject.Mvc3 NuGet पैकेज निम्नलिखित
  2. है एक नया ASP.NET MVC 3 डिफ़ॉल्ट टेम्पलेट

  3. का उपयोग कर आवेदन बनाएं स्थापित करें
  4. RegisterServicesकी विधि में निम्नलिखित जोड़ें:

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel.Bind<FooDbContext>().ToSelf().InRequestScope(); 
        kernel.Bind<IFooRepository>().To<EFFooRepository>(); 
    } 
    
  5. एप्लिकेशन चलाएं। जैसा कि अनुरोध के अंत में अपेक्षित था, FooDbContext उदाहरण का निपटारा किया गया है और NotImplementedException अपवाद फेंक दिया गया है।

+0

यही वही था जो मैं उम्मीद कर रहा था। मेरा मानना ​​है कि डीबीकॉन्टेक्स्ट आईडीस्पोज़ेबल लागू करता है। वास्तव में अगर यह नहीं हुआ तो मैं चौंक गया। धन्यवाद! – Dismissile

+2

@ डिस्मिसाइल, हां, डीबीकॉन्टेक्स्ट आईडीस्पोज़ेबल लागू करता है। –

+0

ओह बहुत अच्छा है। उदाहरण के लिए धन्यवाद। – Dismissile

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