Я рассматривал различные схемы внедрения зависимостей для .NET, поскольку я чувствую, что проект, над которым я работаю, принесет большую пользу. Хотя я думаю, что я хорошо разбираюсь в возможностях этих фреймворков, я все еще немного неясен о том, как лучше внедрить их в большую систему. Большинство демо (по понятным причинам) имеют довольно простые классы, которые имеют одну или две зависимости.
У меня есть три вопроса...
Сначала, как вы справляетесь с этими общими, но неинтересными зависимостями, например. ILog, IApplicationSettings, IPermissions, IAudit. Кажется, излишним для каждого класса иметь эти параметры в своем конструкторе. Было бы лучше использовать статический экземпляр контейнера DI, чтобы получить их, когда они понадобятся?
MyClass(ILog log, IAudit audit, IPermissions permissions, IApplicationSettings settings)
// ... versus ...
ILog log = DIContainer.Get<ILog>();
Второй, как вы подходите к зависимостям, которые могут быть использованы, но могут быть дорогими для создания. Пример. Класс может иметь зависимость от интерфейса ICDBurner, но не хочет, чтобы конкретная реализация была создана, если не была использована функция записи компакт-дисков. Переходите ли вы в интерфейсы к фабрикам (например, ICDBurnerFactory) в конструкторе, или вы снова отправляетесь с каким-то статическим способом напрямую обращаться к контейнеру DI и спрашиваете его в той точке, в которой это необходимо?
Третий, предположим, что у вас большое приложение Windows Forms, в котором компонент GUI верхнего уровня (например, MainForm) является родителем потенциально сотен суб-панелей или модальных форм, каждый из которых может имеют несколько зависимостей. Означает ли это, что MainForm должен быть настроен так, чтобы иметь в качестве зависимостей надмножество всех зависимостей своих детей? И если бы вы это сделали, разве это не привело бы к созданию огромного самонадувающегося монстра, который строит каждый отдельный класс, который ему когда-либо понадобится, когда вы создадите MainForm, тратя время и память в процессе?