Я согласен с вашими проблемами. Запах кода - брать зависимости с единственной целью передать их другим зависимостям.
В зависимости от точного взаимодействия между этими зависимостями у вас есть несколько вариантов:
Если необходим только один экземпляр зависимости
Если вашему Контроллеру нужен только один экземпляр зависимости, просто возьмите зависимость от него.
(извинения за код c #)
Не делайте это:
public class MyController
{
public MyController(IDb db)
{
var dep = new MyDependency(db);
// Use dep or save it for later
}
}
Вместо этого вы можете сделать это:
public class MyController
{
public MyController(MyDependency dep)
{
// Use dep or save it for later
}
}
Вы можете рассмотреть MyDependency
за самим интерфейсом. См. Также Рефакторинг для агрегированных услуг .
Если вам нужно создать несколько экземпляров в течение срока службы контроллера
Иногда, однако, вам нужно динамически создавать несколько экземпляров. Это часто бывает, когда вам нужно значение, которое доступно только во время выполнения, прежде чем вы сможете полностью заполнить зависимость.
В этом случае Abstract Factory является превосходным и универсальным решением .