Создание соглашения для автоматических фабрик

Определяя IDataRepositoryFactory неуниверсальный интерфейс с универсальным Create метод:

public interface IDataRepositoryFactory
{
    T Create<T>(DataContext context) where T : IDataRepository; // new non-generic interface
}

Я могу избежать написания реализаций фабрики:

        _kernel.Bind(t => t.FromAssemblyContaining(typeof(DataRepository<>))
                           .SelectAllInterfaces()
                           .EndingWith("RepositoryFactory")
                           .BindToFactory());

        _kernel.Bind(t => t.FromAssemblyContaining(typeof(DataRepository<>))
                           .SelectAllClasses()
                           .WhichAreNotGeneric()
                           .EndingWith("Repository")
                           .BindAllInterfaces());

Однако у этого решения есть свои плюсы и минусы:

Плюсы:

  • Больше не нужно вручную реализовывать абстрактные фабрики.

Минусы:

  • Имея это IDataRepositoryFactory интерфейс как зависимость, очень похоже на использование сервисного локатора:
    • Всемогущая универсальная фабрика может создавать любые типы репозиториев, даже те, которые находятся в пространствах имен совершенно не связанных модулей.
    • Фактические зависимости теперь скрыты за абстрактной фабрикой; конструктор потребителя больше не документирует статически требуемые репозитории / фабрики.

Нет ли лучшего способа?

1 ответ

Решение

Общие фабричные интерфейсы в настоящее время не поддерживаются. Итак, это уже лучшее, что вы можете сделать.

Другие вопросы по тегам