Если я правильно понимаю, в классической трехуровневой/n-уровневой архитектуре цель состоит в том, чтобы в конечном итоге разделить обязанности таким образом, чтобы каждый уровень не должен был знать о том, что происходит/используется внутри на более низких уровнях.
Однако, если объекты на каждом уровне (особенно бизнес) структурированы так, чтобы их можно было тестировать, их зависимости определяются как часть их публичных контрактов (при тестировании объекта 2-го уровня с зависимостью объекта 3-го уровня имитируйте/заглушайте 3-й уровень). -уровня и предоставить его объекту 2-го уровня). Это означает, что во время реализации первый уровень отвечает за захват зависимости третьего уровня для использования при построении объекта второго уровня. Я не против этого, если это очень мягкий объект, но если это компонент доступа к данным, который требует, например, строки подключения, первый уровень не должен нести за это ответственность. Кроме того, чем больше у вас зависимостей, тем больше верхний уровень отвечает за создание экземпляров и передачу всех зависимостей каждого объекта в ломтике луковицы, который он использует.
Единственный способ, которым я когда-либо видел эту проблему, — это использование IoC, но я работаю в ситуации, когда этот вариант исключен. Существуют ли какие-либо другие способы структурировать код, чтобы его можно было тестировать, но не сталкиваться с проблемой создания/предоставления зависимостей для каждого уровня на верхнем уровне? Я должен упомянуть, что я работаю в веб-приложении.
(Я просмотрел эту публикацию, чтобы освежить в памяти "правила".)
РЕДАКТИРОВАТЬ: я думаю, что могу суммировать проблему как таковую: без использования какого-либо контейнера IoC или загрузчика, есть ли способ структурировать код, чтобы его можно было тестировать, который не нарушает принцип глубины зависимости, который заключается в том, что каждый слой в лук может ссылаться только на слой под ним?