IoC Factory: плюсы и минусы для интерфейса и делегатов

В любом месте, где вам нужно значение времени выполнения для построения конкретной зависимости, Abstract Factory - это решение.

Мой вопрос: Каковы плюсы и минусы обоих решений?

Вот пример, чтобы понять, что я имею в виду

Если у вас есть служба, для которой требуется репозиторий с определенным контекстом, то конструктор службы требуется фабрика для создания репозитория или доступа к нему.

Обычным решением для этого является создание RepositoryFactoryInterface , подобного этому.

public IRepositoryFactory {
    IRepository Create(ContextInformation context);
}

public class MyService {
    private IRepositoryFactory repositoryFactory;
    public MyService(IRepositoryFactory repositoryFactory)
    {
        this.repositoryFactory = repositoryFactory:
    }

    public void DoSomeService()
    {
        ContextInformation context = ....;

        IRepository repository = this.repositoryFactory.Create(context);

        repository.Load(...);
        ...
        repository.Save(...);
    }
}

Вам также необходимо каким-то образом реализовать интерфейс IRepositoryFactory

public MyEf4RepositoryFactory : IRepositoryFactory
{
    IRepository Create(ContextInformation context)
    {
        return new MyEf4Repository(context);
    }
}

... и использовать его в приложении

public void main()
{
    IRepositoryFactory repoFactory = new MyEf4RepositoryFactory();
    IService service = new MyService(repoFactory); 

    service.DoSomeService();
}

- ---- Конец основного решения ------

Вместо RepositoryFactoryInterface вы можете сделать то же самое с factorydelegate , который требует меньше кода, как это.

public class MyService {
    private Func repositoryFactory;
    public MyService(Func repositoryFactory)
    {
        this.repositoryFactory = repositoryFactory:
    }

    public void DoSomeService()
    {
        ContextInformation context = ....;

        IRepository repository = this.repositoryFactory(context);

        repository.Load(...);
        ...
        repository.Save(...);
    }
}

... и используйте это в приложении

public void main()
{
    IService service = new MyService(context => new MyEf4Repository(context)); 

    service.DoSomeService();
}

На мой взгляд, factorydelegate context => new MyEf4Repository (context) намного компактнее, чем объявление и реализация интерфейса IRepositoryFactory и MyEf4RepositoryFactory .

Для этого должна быть причина, и я хочу знать, почему.

Вот один пример источника, который использует интерфейс aproach: ответ на-есть-шаблон-для-инициализации-объектов-созданных-через-ди-контейнер

[Обновление] Спустя 15 месяцев после того, как я задал этот вопрос и получив больше опыта работы с юниверсами Java, я передумал: теперь я предпочитаю интерфейсы делегатам. Но я не могу сказать почему. Это просто ощущение. Может быть, потому что я больше к этому привык?

27
задан Community 23 May 2017 в 12:24
поделиться