Мне нужно создать интерфейс и реализовать его в классе доступа к данным. Также мне придется добавить конструктор
к классу бизнес-логики, который будет
принять параметр этого интерфейса
тип. Так что это означает, что я в конечном итоге
создание класса доступа к данным в
метод приложения Main () и
что-то говорит мне, что это не самое лучшее
подход (это действительно нормально, что
точка входа должна знать о некоторых
вещи доступа к данным? что если цепь
намного дольше или должно быть
несколько цепочек?)
Наоборот! Этот является лучшим подходом, по крайней мере, с точки зрения тестируемости.
Единственный способ сделать ваш уровень бизнес-логики тестируемым - это изолировать его от уровня доступа к данным, выполняя именно то, что вы обдумываете.
Ваше приложение верхнего уровня - то, где доллар останавливается - это единственный компонент, который должен знать, какой конкретно класс доступа к данным.
Если цепочка намного длиннее или имеется несколько цепочек, это не страшно (хотя вы можете рассмотреть возможность сворачивания некоторых прикладных уровней, если они выйдут из-под контроля). Рассмотрим этот потенциальный код в View
приложения Model-View-Presenter
, где Presenter
зависит от CustomerService
, который зависит от Repository
и от AccountingService
(который также зависит на Repository
):
public CustomerView() {
IRespository repository = new ConcreteRepository();
IAccountingService accountingService = new ConcreteAccountingService(repository);
ICustomerService customerService = new ConcreteCustomerService(accountingService, repository)
this._Presenter = new CustomerPresenter(customerService);
}
Наконец, нет необходимости использовать контейнер для инъекций зависимостей, если вы этого не хотите (хотя некоторые из них удивительно легкие) - инъекция зависимостей вручную работает хорошо, пока вы не начнете повторять себя повсюду (или не найдете хотите настроить зависимости во время выполнения).