У меня есть этот wcf метод
Profile GetProfileInfo(string profileType, string profileName)
и бизнес-правило:
если протип файла является "A", считанным из базы данных.
если протип файла является "B", считанным из XML-файла.
Вопрос: как реализовать его с помощью контейнера внедрения зависимости?
Давайте сначала предположим, что у вас есть iProfileRepoithitory что-то вроде этого:
public interface IProfileRepository
{
Profile GetProfile(string profileName);
}
, а также два реализация: DatabaseProfileRepositor
и XMLPROFILEREPOSION
. Выпуск в том, что вы хотели бы выбрать правильный на основе значения Profiletype.
Вы можете сделать это, представляя эту абстрактную фабрику :
public interface IProfileRepositoryFactory
{
IProfileRepository Create(string profileType);
}
Предполагая, что iProfileRePosityFactory вводится в реализацию службы, теперь вы можете реализовать метод GetProfileInfo, как это:
public Profile GetProfileInfo(string profileType, string profileName)
{
return this.factory.Create(profileType).GetProfile(profileName);
}
конкретная реализация Из IProfileRePosityFactory может выглядеть так:
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...
}
}
Теперь вам просто нужно получить свой контейнер для выбора, чтобы провести все это для вас ...