Есть у меня в проекте некий интерфейс
Классы, реализующие
(для простоты я оставлю только ссылки на
Код написан, тесты написаны, все зелено, все работает, выкатывам в продакшен. И тут началось…
IT
и factory метод типаinterface IT {}
public IT CreateT(IA a, IB b, IC c, Type concreteType)
{
// куча говнокода, который создает объект типа concreteType, определяемого в месте вызова в рантайме.
}
Классы, реализующие
IT
, имеют конструкторы с разными сигнатурами, принимающими какую-то комбинацию объектов типов IA
, IB
или IC
, поэтому с ростом количества реализаций IT
, код их создания начинал пахнуть все сильнее, и, наконец, было принято решение его выкинуть и заменить простым кодом с Unity, примерно такого содержания:private static IT CreateITInternal(IA a, Type targetType)
{
using (UnityContainer cont = new UnityContainer())
{
cont.RegisterInstance<IA>(a, new ExternallyControlledLifetimeManager());
cont.RegisterType(typeof(IT), targetType, new ExternallyControlledLifetimeManager());
return cont.Resolve<IT>();
}
}
(для простоты я оставлю только ссылки на
IA
, чтобы не загромождать код. Unity нам тут нужен только для облегчения инстанциирования объектов и мы не хотим давать ему контролировать время жизни никаких объектов, поэтому использован ExternallyControlledLifetimeManager
)Код написан, тесты написаны, все зелено, все работает, выкатывам в продакшен. И тут началось…