Иногда мы можем сделать некоторые аккуратные трюки с нашим контейнером DI, например: автоматическое связывание, управление одиночными играми, управление одним экземпляром за запрос и т. Д. Это замечательно, и может действительно упростить некоторые сценарии.Предотвращение внедрения деталей реализации в установку контейнера для инъекций зависимостей
Проблема, с которой я сталкиваюсь, заключается в том, что проблемы конкретного класса теперь просачиваются на прикладной уровень. Если класс ожидает, что он будет создан и управляется определенным образом (например, как одиночный или только один раз для HTTP-запроса), теперь он находится на уровне приложения, чтобы обеспечить это.
Некоторые проблемы, которые возникают:
1) потенциальные ошибки, как приложение может некорректно настроить ди привязок.
2) Это может сбивать с толку, когда разработчик хочет реализовать пакет, поскольку правила для настройки контейнера DI не предоставляются самим пакетом, и поэтому вместо этого должны быть документированы в комментариях или сопутствующих тестовых случаях (что не является идеальным).
3) Если реализация класса изменяется, в настоящее время ответственность каждого приложения, использующего класс, обновлять привязки контейнеров DI.
Вот некоторые примеры привязки, которые вы можете сделать с помощью Ninject, что всех выставки этой проблемы:
public class MyApplicationsInjectionModule : NInjectModule
{
public void Load()
{
Bind<IFoo>().ToConstant(FooThatShouldBeASingleton.Instant);
Bind<IFoo>().To<FooThatShouldBeASingleton>().AsSingleton();
Bind<IFoo>().To<FooThatShouldOnlyBeInstantiatedOncePerRequest>().InRequestScope();
}
}
Моего опыт только с Ninject - возможно, некоторые другие контейнеры DI справиться с этой проблемой более элегантно.
Какие стратегии мы можем предпринять, чтобы избежать этих проблем, не отказываясь от мощности, которую предоставляет контейнер DI?
ОК, так что вы в основном говорите: держите это просто - просто не пробуйте ничего сложного. – cbp