2011-01-02 6 views
10

Mam klasę jednostki, która jest automatycznie generowana z mojego modelu bazy danych. Ta klasa dziedziczy ObjectContext, który inwertuje IDisposable.Utylizacja kontekstu obiektu w strukturze jednostki 4

Utworzyłem repozytorium, które ma różne metody, które wykorzystują pojedyncze wystąpienie obiektu encji do interakcji z bazą danych.

Auto generowane klasa

public partial class DevEntities : ObjectContext 
{ 
    public const string ConnectionString = "name=DevEntities"; 
    public const string ContainerName = "DevEntities"; 

Repository klasy

DevEntities db = new DevEntities(); 

     public Customer GetCustomerByID(int id) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.CustomerId == id); 

     return customers; 
    } 

    public Customer GetCustomerByPasswordUsername(string email, string password) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.Email == email && c.Password == password); 

     return customers; 
    } 

Z tego widać, że robię wiele odwołań do instancji DB. Moje pytanie brzmi: czy lepiej jest utworzyć instancję nowej DevEntity w ramach każdej metody, dzięki czemu będę w stanie zaimplementować instrukcję using, a więc zapewnić poprawną likwidację, czy też moja obecna implementacja jest OK?

Odpowiedz

9

Zaimplementowałbym również IDisposable w klasie Repository, dzięki czemu może pozbyć się ObjectContext. Jeśli za każdym razem zwrócisz inny obiekt ObjectContext, możesz napotkać problemy podczas wykonywania zapytań między tymi obiektami, ponieważ są one dołączone do różnych ObjectContext s, co spowoduje wyjątek.

Definicja:

public class Repository : IDisposable 
{ 
    DevEntities db = new DevEntities(); 

    public Customer GetCustomerByID(int id) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.CustomerId == id); 

     return customers; 
    } 

    public Customer GetCustomerByPasswordUsername(string email, string password) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.Email == email && c.Password == password); 

     return customers; 
    } 

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

Zastosowanie:

using(Repository r = new Repository()) 
{ 
    //do stuff with your repository 
} 

Spowoduje to, repozytorium zajmuje umieszczając ObjectContext po jej stosować.

+0

Gdybym to zrobił, musiałbym przesłonić metodę usuwania IDisposable, tak myślę? Więc jak to może wyglądać? Czy unieszkodliwiłby obiekt, a każda metoda odwoływałaby się do tej metody, a tym samym spychała tam przykład? – hoakey

+0

Nie, nie musisz go przesłonić, implementujesz interfejs w swoim repozytorium; teraz możesz użyć repozytorium w instrukcji using, więc klasa zostanie automatycznie usunięta po zakończeniu użytkowania. – Femaref

+0

Przepraszam za moją grubość, nadal nie rozumiem, jak to by działało. Czy mógłbyś jeszcze trochę bardziej rozwinąć? Wielkie dzięki. – hoakey