Я новичок в издевательстве и внедрении зависимостей, и мне нужно руководство.
Мое приложение использует типичную N-уровневую архитектуру, в которой BLL ссылается на DAL, а пользовательский интерфейс ссылается на BLL, но не на DAL. Довольно прямо вперед.
Допустим, например, у меня есть следующие классы:
class MyDataAccess : IMyDataAccess {}
class MyBusinessLogic {}
Каждый существует в отдельной сборке.
Я хочу издеваться над MyDataAccess в тестах на MyBusinessLogic. Поэтому я добавил конструктор в класс MyBusinessLogic, чтобы принять параметр IMyDataAccess для внедрения зависимости. Но теперь, когда я пытаюсь создать экземпляр MyBusinessLogic на уровне пользовательского интерфейса, требуется ссылка на DAL.
Я подумал, что мог бы определить конструктор по умолчанию в MyBusinessLogic, чтобы установить реализацию IMyDataAccess по умолчанию, но это не только похоже на кодовый код, но фактически не решает проблему. У меня все еще был бы публичный конструктор с IMyDataAccess в подписи. Таким образом, уровень UI все еще требует ссылки на DAL для компиляции.
Одним из возможных решений, с которым я играю, является создание внутреннего конструктора для MyBusinessLogic с параметром IMyDataAccess. Затем я могу использовать Accessor из тестового проекта для вызова конструктора. Но все еще есть этот запах.
Какое общее решение здесь. Я просто должен делать что-то не так. Как я могу улучшить архитектуру?