primero vamos a suponer que usted tiene un algo IProfileRepository así:
public interface IProfileRepository
{
Profile GetProfile(string profileName);
}
así como dos implementaciones: DatabaseProfileRepository
y XmlProfileRepository
. El problema es que le gustaría elegir el correcto según el valor de profileType.
Usted puede hacer esto mediante la introducción de este Abstract Factory:
public interface IProfileRepositoryFactory
{
IProfileRepository Create(string profileType);
}
Suponiendo que el IProfileRepositoryFactory ha sido inyectado en la implementación del servicio, ahora se puede poner en práctica el método GetProfileInfo así:
public Profile GetProfileInfo(string profileType, string profileName)
{
return this.factory.Create(profileType).GetProfile(profileName);
}
Una implementación concreta de IProfileRepositoryFactory podría verse así:
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...
}
}
Ahora sólo tiene que conseguir su contenedor de DI de elección de unirlo todo por ti ...
Esos 'sis' secuenciales podrían ser reemplazados por un' interruptor/caso' más rápido/más legible. Y 'profileType' realmente debería ser una enumeración, no una cadena arbitraria. Aparte de eso, es una gran respuesta. :) – Aaronaught
Sí, no hay desacuerdo allí, pero acabo de ir con la API dada por el OP :) –
¿De qué manera puede cambiar si no sé en tiempo de compilación el número de repositorios? Y si mi wcf solo tiene dependencias con la biblioteca de registro y estos repositorios, ¿cuál es la mejor opción de DI Container? ¿MEF es una buena choiche en este escenario? – tartafe