Voyons d'abord supposer que vous avez quelque chose d'IProfileRepository comme ceci:
public interface IProfileRepository
{
Profile GetProfile(string profileName);
}
ainsi que deux implémentations: DatabaseProfileRepository
et XmlProfileRepository
. Le problème est que vous souhaitez choisir le bon en fonction de la valeur de profileType.
Vous pouvez le faire en introduisant cette Abstract Factory:
public interface IProfileRepositoryFactory
{
IProfileRepository Create(string profileType);
}
En supposant que le IProfileRepositoryFactory a été injecté dans la mise en œuvre de service, vous pouvez maintenant mettre en œuvre la méthode GetProfileInfo comme ceci:
public Profile GetProfileInfo(string profileType, string profileName)
{
return this.factory.Create(profileType).GetProfile(profileName);
}
Une implémentation concrète de IProfileRepositoryFactory peut ressembler à ceci:
public class ProfileRepositoryFactory : IProfileRepositoryFactory
{
private readonly IProfileRepository aRepository;
private readonly IProfileRepository bRepository;
public ProfileRepositoryFactory(IProfileRepository aRepository,
IProfileRepository bRepository)
{
if(aRepository == null)
{
throw new ArgumentNullException("aRepository");
}
if(bRepository == null)
{
throw new ArgumentNullException("bRepository");
}
this.aRepository = aRepository;
this.bRepository = bRepository;
}
public IProfileRepository Create(string profileType)
{
if(profileType == "A")
{
return this.aRepository;
}
if(profileType == "B")
{
return this.bRepository;
}
// and so on...
}
}
Maintenant, vous avez juste besoin d'obtenir votre conteneur DI de choix pour câbler tout pour vous ...
Ces 'ifs 'séquentiels pourraient être remplacés par un' switch/case' plus rapide/plus lisible. Et 'profileType' devrait vraiment être une énumération, pas une chaîne arbitraire. A part ça, c'est une excellente réponse. :) – Aaronaught
Oui, pas de désaccord là-bas, mais je suis juste allé avec l'API donnée par l'OP :) –
De quelle façon cela peut-il changer si je ne sais pas au moment de la compilation le nombre de dépôts? Et si mon wcf n'a que des dépendances avec la bibliothèque de logs et ces dépôts, où est le meilleur choix de conteneur DI? MEF est-il un bon choix dans ce scénario? – tartafe