Есть ли у 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 и использовать его в вызове RegisterConditional:

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). Первый способ, однако, является предпочтительным, если это возможно.

Другие вопросы по тегам