Autofac resolv Универсальный тип с параметрами конструктора во время выполнения - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть универсальный класс Logger<TProvider> where TProvider : ILogProvider, для которого я хотел бы настроить внедрение зависимостей с помощью Autofac.

Этот класс также имеет конструктор:

public Logger(LogType loggerType)

, который в настоящее время используетсякак это:

var logger = new Logger<Log4NetLogProvider>(LogType.CMS);

Мне было интересно, может ли это быть инъекция зависимости или это будет невозможно из-за требуемого параметра типа / конструктора?

Мне известно о RegisterGenericметод, например:

builder.RegisterGeneric(typeof(Logger<>)).AsSelf()

Мне было интересно, как я могу сказать autofac, какой TProvider был передан, а также предоставить параметр конструктора LogType?Или это не хороший кандидат на DI?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Я справился с вашей проблемой следующим образом:

Я зарегистрировал общий класс, как вы это сделали.

builder.RegisterGeneric(typeof(Logger<>));

После этого я зарегистрировал его с типом, подобнымтак:

 builder.RegisterType<Logger<TProvider>>()
                .As<ILogger<TProvider>>()
                .WithParameter("loggerType", LogType.CMS);

или вы можете сделать это с параметром Typed следующим образом:

builder.RegisterType<Logger<TProvider>>()
                    .As<ILogger<TProvider>>()
                    .WithParameter(TypedParameter.From(LogType.CMS)));

С заменой TProvider на параметр, то есть

builder.RegisterType<Logger<LogProvider>>()
                        .As<ILogger<LogProvider>>()
                        .WithParameter(TypedParamater.From(LogType.CMS)));
0 голосов
/ 25 сентября 2018

Вы можете попробовать использовать расширение WithParameter при регистрации типа

//using named parameter
builder.RegisterGeneric(typeof(Logger<>))
    .AsSelf()
    .WithParameter("loggerType", LogType.CMS);

//OR - using typed parameter
builder.RegisterGeneric(typeof(Logger<>))
   .AsSelf()
   .WithParameter(new TypedParameter(typeof(LogType), LogType.CMS));

Ссылка Передача параметров в регистр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...