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.
Je suppose que la définition des méthodes n'était pas intentionnelle. D'autres idées, quelqu'un? – Martin
oups, right you are .... corrigé –
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