Передача значения конструктора тем же параметрам реализации в соответствии с контекстом с помощью autofac - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть 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) { ... }

       ...
   }
}

Мне нужны два разных singletons ... Один на контроллер, где параметр конструктора 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....
}

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

Спасибо

1 Ответ

0 голосов
/ 01 мая 2020

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

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)
    );
}
...