2009-10-02 6 views
5

Je suis nouveau dans le modèle de référentiel mais j'ai essayé, mon but est de faire un design qui me permette facilement avec quelques modifications "injection de dépendances, ou modifications de configuration" pour passer à un autre ORM sans toucher aux autres couches de solution .comment concevoir le modèle de dépôt pour être facile passer à un autre ORM plus tard?

je suis arrivé à cette mise en œuvre: alt text

et voici le code:

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 
} 
utilisation

dans ma page 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(); 
    } 

Comme vous avez vu dans le code précédent je suis maintenant en utilisant LINQ to sql, et comme vous le voyez, mon code est lié à LINQ to sql, comment changer cette conception de code pour atteindre mon objectif "être capable de changer à un autre ORM easly, par exemple au cadre entité ADO.net ou subsonique »

conseils S'il vous plaît avec le code simple exemple

Répondre

3

Inc mur o » Texte

Ce que vous faites est juste, votre code serait appliqué à chaque référentiel. Comme vous l'avez indiqué, l'objectif du modèle Repository est de vous permettre d'échanger la façon dont les données sont livrées à votre application sans avoir à refactoriser votre code dans votre application (interface utilisateur/couche de distribution). Prenez par exemple, vous décidez de passer à Linq pour Entités ou ADO.NET.

Tout ce dont vous avez besoin est d'écrire le code pour l'ORM que vous utiliserez (en ayant hérité de l'interface appropriée), puis demandez à votre code d'utiliser ce référentiel. Bien sûr, vous devrez remplacer toutes les références de l'ancien référentiel ou renommer/remplacer vos anciens dépôts ORM afin que votre application utilise les dépôts appropriés (sauf si vous utilisez un type de conteneur IoC, dans lequel vous spécifieriez le référentiel à transmettre) .

Le reste de votre application continuerait à fonctionner correctement puisque toutes les méthodes que vous avez utilisées pour obtenir/éditer vos données retourneront les objets appropriés.

En temps de profane, les dépôts fourniront à votre application les données dont elle a besoin de la même manière. La seule différence est la façon dont ces données sont récupérées à partir de votre base de données (ADO.NET/Linq à quelque chose, etc.)

Avoir vos classes hériter des interfaces de référentiel est une contrainte stricte en s'assurant qu'elles produisent les données d'une manière uniforme est d'accord avec la façon dont votre application l'utilise.

Questions connexes