2009-10-02 6 views
5

Jestem nowy na wzór repozytorium, ale próbowałem, moim celem jest stworzenie projektu, który pozwoli mi łatwo z kilkoma zmianami "wtyczkę zależności lub edycje konfiguracji", aby móc przełączyć się na inną ORM bez dotykania innych warstw rozwiązania .jak zaprojektować wzór repozytorium, aby później łatwo przejść na inny ORM?

dotarłem tej realizacji: alt text

i oto kod:

public interface IRepository<T> 
{ 
    T Get(int key); 
    IQueryable<T> GetAll(); 
    void Save(T entity); 
    T Update(T entity); 
    // Common data will be added here 
} 
public interface ICustomerRepository : IRepository<Customer> 
{ 
    // Specific operations for the customers repository 
} 
public class CustomerRepository : ICustomerRepository 
{ 
    #region ICustomerRepository Members 

    public IQueryable<Customer> GetAll() 
    { 
     DataClasses1DataContext context = new DataClasses1DataContext(); 
     return from customer in context.Customers select customer; 
    } 

    #endregion 

    #region IRepository<Customer> Members 

    public Customer Get(int key) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Save(Customer entity) 
    { 
     throw new NotImplementedException(); 
    } 

    public Customer Update(Customer entity) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

Wykorzystanie w mojej strony aspx:

protected void Page_Load(object sender, EventArgs e) 
    { 
     IRepository<Customer> repository = new CustomerRepository(); 
     var customers = repository.GetAll(); 

     this.GridView1.DataSource = customers; 
     this.GridView1.DataBind(); 
    } 

Jak widzieliśmy w poprzednim kodzie I am teraz przy użyciu LINQ do sql, i jak widzisz mój kod jest związany z LINQ do sql, jak zmienić ten projekt kodu, aby osiągnąć mój cel "być w stanie zmienić na inny ORM w łatwy, na przykład do Entity Framework ADO.net lub poddźwiękowych”

Proszę o poradę z kodem prosty przykładowy

Odpowiedz

3

Inc ścienny o” Text

Co robisz jest słuszne, Twój kod zostanie zastosowany do każdego repozytorium.

Jak już wspomniano, celem wzoru repozytorium jest umożliwienie wymiany sposobu dostarczania danych do aplikacji bez konieczności refaktoryzacji kodu w aplikacji (warstwa interfejsu użytkownika/dostarczania).

Weźmy na przykład, zdecydujesz się przełączyć na Linq na Entities lub ADO.NET.

Wszystko, czego potrzebujesz, to napisać kod ORM, którego będziesz używał (po tym, jak odziedziczy on właściwy interfejs), a następnie poprosić twój kod o użycie tego repozytorium. Oczywiście musisz zastąpić wszystkie odniesienia do starego repozytorium lub zmienić nazwę/zastąpić stare repozytorium ORM tak, aby aplikacja korzystała z poprawnych (chyba że używasz kontenera IoC, w którym możesz określić, które repozytorium ma przekazać) .

Reszta aplikacji będzie działać poprawnie, ponieważ wszystkie metody użyte do pobrania/edycji danych zwrócą odpowiednie obiekty.

W terminach laika, repozytoria będą przekazywać aplikacji potrzebne dane w ten sam sposób. Jedyna różnica polega na tym, jak dane są pobierane z bazy danych (ADO.NET/Linq na coś podobnego).

Posiadanie klas dziedziczenia interfejsów repozytoriów jest trudnym ograniczeniem, zapewniającym wyjście danych w sposób jednolity, zgadza się ze sposobem, w jaki używa go aplikacja.