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