2011-02-13 12 views
5

मैं अपने विंडोज़ फॉर्म एप्लिकेशन पर डेटा स्टोर और एक्सेस करने के लिए एमएसएसक्यूएल के साथ एंटीटी फ्रेमवर्क 4 का उपयोग कर रहा हूं।इस संदर्भ में मैं आईडीस्पोजिबल कैसे लगाऊंगा?

public class StudentRepository : IDisposable 
{ 
    ColegioDBEntities db = new ColegioDBEntities(); 

    public IQueryable<Student> FindAllStudents() 
    { 
     return db.Students; 
    } 

    public Student FindStudent(int id) 
    { 
     return db.Students.SingleOrDefault(c => c.StudentId == id); 
    } 

    public void Add(Student Student) 
    { 
     db.AddToStudents(Student); 
    } 

    public void Save() 
    { 
     db.SaveChanges(); 
    } 

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

यहाँ और कैसे मैं इसका उपयोग का एक उदाहरण है:

यहाँ एक उदाहरण वर्ग मैं डेटा एक्सेस करने हेतु उपयोग करें।

private void btnLogin_Click(object sender, EventArgs e) 
    { 
     UserRepository repo = new UserRepository(); 
     var result = repo.FindAllUsers().Where(u => u.Username == txtUsername.Text && u.Password == txtPassword.Text); 
     if (result.Count() > 0) 
     { 
      MainForm form = new MainForm(txtUsername.Text); 
      form.Show(); 
      this.Hide(); 
     } 
     else 
     { 
      MessageBox.Show("Usuario y/o contraseña incorrecta.", 
      "Acceso Denegado", 
      MessageBoxButtons.OK, 
      MessageBoxIcon.Stop, 
      MessageBoxDefaultButton.Button1); 
      txtUsername.Focus(); 
      txtPassword.Focus(); 
     } 
    } 

किसी ने सुझाव दिया कि मैं कनेक्शन को "साफ" करने के लिए आईडीस्पोजेबल का उपयोग करता हूं, लेकिन मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए।

कोई सुझाव? आपके समय के लिए शुक्रिया।

उत्तर

3

सुनिश्चित नहीं हैं कि अगर मैं वास्तव में बिंदु मिल गया है, लेकिन आप IDisposable लागू करने के लिए लग रहे हैं, लेकिन आप Dispose कॉल करने के लिए या का उपयोग using की जरूरत है:

using(UserRepository repo = new UserRepository()) 
    { 
    // ... 
    } 

यह जब ब्लॉक का उपयोग छोड़ने निपटान कॉल और UserRepository को साफ ।

+0

आह! वह मुद्दा था। :) मैं उपयोग कथन शामिल करना भूल गया ताकि ऑब्जेक्ट का निपटारा हो। आपके समय के लिए धन्यवाद। क्या आप सलाह देते हैं कि जब भी मैं रिपोजिटरी क्लास का उपयोग करता हूं तो मैं ऐसा करता हूं? –

+0

IDISposable प्रकारों से निपटने के दौरान आपको वास्तव में ऐसा करना चाहिए। यदि आप नहीं करते हैं तो आपको मेमोरी लीक और शायद खराब दुष्प्रभाव मिलते हैं। –

+0

हां बेशक, एक वर्ग के हर उदाहरण जिसे निपटान किया जा सकता है उसे इसका उपयोग करने के बाद निपटान किया जाना चाहिए। – Enyra

1

यह StudentRepository या UserRepository है:

कुछ और जानकारी भी नहीं है? और यदि कोई दूसरे से निकलता है तो आपको एक समस्या है।

विरासत के बिना छात्र रिपोजिटरी का कार्यान्वयन स्वीकार्य है। यह घोषणा करके पूरी तरह से सही आप यह सुनिश्चित करना चाहिये होना करने के लिए सील कर दिया:

public sealed class StudentRepository : IDisposable 
{ 
    .... 
    public void Dispose() 
    { 
     db.Dispose(); 
    } 
} 

और, जैसा कि @Stefan पहले ही बताया है, तो आप इसका इस्तेमाल हर बार जब आप using() { } के साथ एक StudentRepository का दृष्टांत, करना है।

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