2010-03-02 5 views
3

Je suis en train de refactoriser toutes mes interfaces de référentiel de différents types. La plupart d'entre eux contiennent des méthodes très similaires comme Add, Update mais certains ont des méthodes qui n'ont de sens que pour un type spécifique. Ceci est une question de bonnes pratiques. J'ai pensé à utiliser des génériques pour redresser les choses.Interfaces génériques spécifiques

public interface IRepository<T> 
{ 
     T Get(int id); 
     void Add(T x); 
} 

Mais maintenant pour les méthodes spécifiques. Je pourrais bien sûr "sous-classer" l'interface, mais je ne suis pas mieux lotie qu'avant. J'ai le code comme:

IUserRepository<User> users; 

Une belle façon serait si je pouvais avoir de multiples contraintes comme:

public partial interface IRepository<T> 
{ 
     T Get(int id); 
     void Add(T x); 
} 

public partial interface IRepository<T> where T: User 
{ 
     T Get(Guid id); 
} 

public partial interface IRepository<T> where T: Order 
{ 
     T Get(string hash); 
} 

Mais le compilateur se plaint de l'héritage en conflit. Annother façon serait sur les méthodes contraintes:

public partial interface IRepository<T> 
{ 
     T Get(int id); 
     void Add(T x); 

     T Get(Guid id) where T: User; 
     T Get(string hash) where T: Order; 
} 

Mais ce n'est pas tout à fait la façon dont ceux-ci ce travail est-il. Le compilateur n'a pas mes intentions et veut une définition de type sur la méthode, bien sûr.

À l'heure actuelle, j'ai juste des méthodes qui lancent NonImplemented. Laid.

Je suis à la recherche d'une solution qui me fera me lancer.

Répondre

6
public interface IRepository<TEntity, TId> 
{ 
     TEntity Get(TId id); 
     void Add(T x); 
} 

public class UserRepository : IRepository<User, Guid> 
{ 
    public User Get(Guid id) 
    { 
     // ... 
    } 

    public void Add(User entity) 
    { 
     // ... 
    } 
} 

public class OrderRepository : IRepository<Order, string> 
{ 
    //... 
} 
+0

Je suppose que la définition des méthodes n'était pas intentionnelle. D'autres idées, quelqu'un? – Martin

+0

oups, right you are .... corrigé –

+0

Pas parfait. Je peux implémenter IRepository qui n'a aucun sens. De plus, ça va être une longue liste de types. Donc, pour cette raison, je préfère "subinterfacing" comme IUserRepository: IRepository . – Martin

Questions connexes