Есть ли у Simple Injector способ регистрации на фабрике экземпляров в сочетании с TypeFactoryContext?
Я работаю над устаревшей кодовой базой, которая серьезно нуждается в рефакторинге в соответствии с принципами SOLID. В качестве первого шага мы добавляем контейнер для инъекций зависимостей Simple Injector.
Для одной из регистраций мне нужно нечто очень похожее на пример RegisterConditional для Log4Net, а именно:
container.RegisterConditional(
typeof(ILogger),
c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Singleton,
c => true);
Разница в том, что я хочу внедрить экземпляр, возвращенный фабричным методом, который принимает в качестве входных данных c.Consumer.ImplementationType:
container.Register???(
typeof(ILogger),
c => LoggerProvider.GetLogger(c.Consumer.ImplementationType),
Lifestyle.Transient);
Можно ли это сделать с помощью простого инжектора?
Я прочитал ответ на подобный вопрос, но этого недостаточно. Реализация Type должна быть передана фабрике экземпляра.
В настоящее время я буду реализовывать Logger
public class Logger<TParent> : ILogger
{
private readonly ILogger _decoratedLogger;
public Logger()
{
_decoratedLogger = Logger.GetLogger(typeof(TParent));
}
}
1 ответ
Можно ли это сделать с помощью простого инжектора?
И да и нет.
Нет, это не поддерживается с помощью
RegisterConditional
и это потому, что Simple Injector пытается подтолкнуть вас к регистрации типов, чтобы он мог как можно больше проверять и диагностировать ваш объектный граф. Предпочтительным способом является создание прокси-класса, как описано здесь. Это в основном объясняет ваше текущее решение, но имеетLogger<T>
что наследует отLogImp
вместо этого, поскольку это приводит к более простому решению.Да, это возможно, но вам придется вернуться к использованию пользовательских
IDependencyInjectionBehavior
как объяснено здесь (пример для Serilog, но может быть легко переписан в log4net). Первый способ, однако, является предпочтительным, если это возможно.