Передача значения конструктора в те же параметры реализации в соответствии с контекстом с помощью autofac

У меня есть некоторые контроллеры mvc, которые должны создавать экземпляр одного регистратора в соответствии с полным именем контроллера.

Я пытаюсь объяснить на примерах. У меня есть этот интерфейс логгера:

public interface Ilogger { ... }

и его реализация

public class MyLogger 
{ 
    public MyLogger(loggerName) 
    {
        ...
    }

    ...
}

Что ж, теперь мне нужны разные регистраторы на контроллеры.

namespace Controllers
{
   public class MyFirstController
   {
       public MyFristController(Ilogger logger) { ... }

       ...
   }
}

namespace Controllers
{
   public class MySecondoController
   {
       public MySecondoController(Ilogger logger) { ... }

       ...
   }
}

Мне нужны два разных синглтона ... По одному на контроллер, где параметр конструктора loggerName из MyLoggerClass должен изменяться в соответствии с контроллером. Итак, мне нужны два экземпляра:

new MyLogger("Controllers.MyFirstController")

а также

new MyLogger("Controllers.MySecondoController")

Я пробую что-то вроде этого:

builder.RegisterControllers(assemblies)
    .PropertiesAutowired()
     .WithConstructorParameter(typeof(ILoggerProvider));

Где WithConstructorParameter - метод расширения:

public static IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> WithConstructorParameter<TLimit, TReflectionActivatorData, TStyle>(this IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> registration, Type targetType)
    where TReflectionActivatorData : ReflectionActivatorData
{
    return registration.WithParameter(
        (pi, ctx) => pi.ParameterType == targetType,
        (pi, ctx) => ...)); // <-- I have been losing here....
}

Это правильный подход? Как я могу решить свою проблему?

Спасибо


person Ciccio    schedule 30.04.2020    source источник
comment
Да, я видел этот пример ... Я пытался реализовать его, но было что-то, что я не мог сделать ... сейчас я не помню, честно говоря, потому что я делал разные попытки ... Я решил с помощью этой строки код: (pi, ctx) => ctx.ResolveNamed(pi.Member.DeclaringType.FullName, targetType)   -  person Ciccio    schedule 01.05.2020
comment
Если вы ее решили, вы должны опубликовать ответ на свой вопрос, чтобы люди не бросались сюда и не продолжали пытаться ответить вам. Рад, что у вас все получилось!   -  person Travis Illig    schedule 01.05.2020


Ответы (1)


Я изменил методы расширения следующим образом:

public static IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> WithNamedParameter<TLimit, TReflectionActivatorData, TStyle>(this IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> registration, Type targetType)
    where TReflectionActivatorData : ReflectionActivatorData
{       
    return registration.WithParameter(
        (pi, ctx) => pi.ParameterType == targetType,
        (pi, ctx) => ctx.ResolveNamed(pi.Member.DeclaringType.FullName, targetType)
    );
}
person Ciccio    schedule 01.05.2020