2010-11-30 46 views
2

J'utilise le modèle de référentiel trouvé dans la réponse à cette question SO:Comment utiliser IoC DI avec ce modèle de référentiel?

Advantage of creating a generic repository vs. specific repository for each object?

A savoir, chaque dépôt hérite d'une classe de base abstraite qui contient des méthodes génériques comme ajouter, supprimer, etc., et aussi des outils une interface de référentiel spécifique pour toutes les méthodes propres à ce référentiel/entité.

ie.

public class CompanyRepository : Repository<Company>, ICompanyRepository { 
... 
} 

Dans ma couche métier J'utilise Carte structure pour obtenir une instance du dépôt, mais je ne suis pas sûr comment l'utiliser.

// Structure Map initialisation 
ObjectFactory.Initialize(
x => 
{      
     x.For<ICompanyRepository>().Use<CompanyRepository>(); 
}); 

résoudre une instance:

return ObjectFactory.GetInstance<ICompanyRepository>(); 

Cependant l'instance que je reçois est une interface et non l'ensemble de la mise en œuvre du référentiel. Je n'ai pas accès aux méthodes de la classe de base (Repository<Company>). Quelle est la manière habituelle de faire ceci?

Répondre

2

La clé ici est de penser à Repository<> uniquement comme un détail de mise en œuvre. Vous n'accéderez à aucune méthode directement dessus; à la place, vous exposer toutes les méthodes, y compris Insert et Delete, sur l'interface:

public interface ICustomerRepository 
{ 
    // ...Customer-specific queries... 

    void Insert(Customer customer); 

    void Delete(Customer customer); 
} 

Lorsque vous implémentez l'interface CustomerRepository, il vous suffit de passer les Insert et Delete appels vers les méthodes protégées de Repository<> comme discuté dans la question initiale.

L'enregistrement StructureMap que vous indiquez dans la question correspond exactement à ce que j'attendrais. Le but de Repository<> est alors d'aider à la mise en œuvre d'interfaces spécifiques à l'entité. Gardez à l'esprit que les interfaces contiendront toujours l'API publique complète du référentiel et que cela devrait vous orienter dans la bonne direction.

+0

Grande -thanks pour la clarification - Il me manquait l'étape d'exposer les méthodes Repository <> sur l'interface. – dan

1

Pourquoi ne pas

return ObjectFactory.GetInstance<Repository<Company>>; 

? Vous devrez modifier en conséquence votre initialisation ObjectFactory:

// Structure Map initialisation 
ObjectFactory.Initialize(
    x => {      
     x.For<Repository<Company>>().Use<CompanyRepository>(); 
    }); 

EDIT
Si vous voulez toujours obtenir Repository<Company> aussi pour ICompanyRepository, vous devez déclarer une expédition:

// Structure Map initialisation 
ObjectFactory.Initialize(
    x => {      
     x.For<Repository<Company>>().Use<CompanyRepository>(); 
     x.Forward<Repository<Company>, ICompanyRepository>(); 
    }); 
+0

Ensuite, je n'ai pas accès aux méthodes définies dans l'interface. J'ai vraiment besoin d'un CompanyRepository mais je ne sais pas si cela annulera l'avantage de DI/IoC. – dan

+0

Voir la mise à jour. – Simone

+0

Merci pour vos commentaires. Comment puis-je obtenir un CompanyRepository? return ObjectFactory.GetInstance >() et le transtyper dans un CompanyRepository? Ça semble fonctionner. – dan