Внедрение зависимости WCF и абстрактная фабрика

У меня есть этот wcf метод

Profile GetProfileInfo(string profileType, string profileName)

и бизнес-правило:

если протип файла является "A", считанным из базы данных.

если протип файла является "B", считанным из XML-файла.

Вопрос: как реализовать его с помощью контейнера внедрения зависимости?

19
задан Marcin Szymczak 22 September 2014 в 14:33
поделиться

1 ответ

Давайте сначала предположим, что у вас есть 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...
    }
}

Теперь вам просто нужно получить свой контейнер для выбора, чтобы провести все это для вас ...

23
ответ дан 30 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: