2009-07-08 5 views

Répondre

1

C'est très possible mais vous ne devez pas utiliser une interface commune ou faire beaucoup de casting. Grâce à une interface ...

public interface IRepository 
{ 
    public object Get(int id); // or object id 
    public void Save(object obj); 
} 

public class CustomerRepository : IRepository 
{ 
    public object Get(int id) { // implementation } 
    public void Save(object obj) { // implementation } 
} 

Cela fonctionne bien, mais le code appelant doit jeter des objets au bon type et des méthodes mises en œuvre concrètes doivent vérifier le type et lancer des exceptions. La diffusion directe demande des exceptions d'exécution donc j'éviterais cette approche.

L'approche que je recommande est de ne pas avoir vos référentiels implémenter une interface commune. Au lieu de cela, implémentez les méthodes communément nommées par convention.

public class CustomerRepository 
{ 
    public Customer Get(int id) { // implementation } 
    public void Save(Customer entity) { // implementation } 
} 

public class EmployeeRepository 
{ 
    public Employee Get(int id) { // implementation } 
    public void Save(Employee entity) { // implementation } 
} 

Édité pour ajouter: J'ai relu la réponse liée. Le dernier paragraphe complet me perd mais je peux développer un peu sur l'utilisation de DI. Dans la plupart des cas, il ne serait pas judicieux d'utiliser DI pour injecter un référentiel «générique» (dans ce cas, le sens dérivé d'une interface commune). En plus des méthodes communes, un référentiel aura des méthodes spécifiques à l'entité telles que GetCustomersWithPastDueAccounts. Vous pouvez définir un ICustomerRepository avec cette méthode et demander à votre CustomerRepository de l'implémenter. Vous pouvez ensuite utiliser l'injection de dépendance pour injecter CustomerRepository à l'exécution. Il n'y a rien de mal à cela, mais d'après mon expérience, il est assez rare que vous disposiez de plusieurs implémentations d'un référentiel, donc cela ne sert à rien.

+0

Mais avec votre deuxième approche, est-ce que je ne perds pas la possibilité d'injecter des dépendances? –

+1

Vous pouvez toujours effectuer une injection de dépendance manuelle. Mais vous avez raison, vous ne seriez pas en mesure d'utiliser un cadre DI pour faire l'injection de dépendance. Je vais modifier ma réponse et ajouter plus d'explications. –

+0

Donc, fondamentalement, il y a une interface pour chaque dépôt, et cela peut être utilisé pour DI. Pour 10 entités, 10 interfaces, avec au moins 10 implémentations. Vous avez raison? –

0

sauf si j'ai mal lu quelque chose, la réponse acceptée dans la question que vous avez liée n'utilise pas de génériques. Il définit une interface et utilise le terme «générique» pour indiquer que l'interface n'est pas liée directement à une table spécifique du modèle.

+0

Je ne pense pas que ce soit le cas, mais si c'est le cas, quelles seraient les signatures de ces 7 fonctions dans IEntityRepository? –

+1

Il fait référence à l'implémentation du référentiel qui utilise l'interface IRepository . –

Questions connexes