Иногда мы можем сделать несколько полезных трюков с нашим DI-контейнером, например: автоматическое связывание, управление синглетами, управление одним экземпляром на запрос и т. Д. Это замечательно и может действительно упростить некоторые сценарии.
Проблема, с которой я столкнулся, заключается в том, что проблемы конкретного класса теперь просачиваются на прикладной уровень.Если ожидается, что класс будет создан и управляться определенным образом (например, как одиночный, или только один раз для http-запроса), теперь это зависит от уровня приложения, чтобы гарантировать, что это происходит.
Некоторые проблемы, которыепроисходят:
1) Потенциальные ошибки, так как приложение может неправильно настроить привязки DI.
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?