2013-07-18 3 views
0

Определяя 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 интерфейс как зависимость, чувствует себя много, как с помощью службы локатора:
    • Всесильный родовое завод может создать любого типа хранилища , даже в пространствах имен полностью несвязанных модулей.
    • Фактические зависимости теперь скрыты за абстрактной фабрикой; конструктор потребителя больше не статически документирует требуемые репозитории/фабрики.

Есть не лучший способ?

ответ

0

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

Смежные вопросы