【问题标题】:Passing constructor value to same implementation parameters according the context with autofac使用 autofac 根据上下文将构造函数值传递给相同的实现参数
【发布时间】:2020-08-14 15:19:26
【问题描述】:

我有一些 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) { ... }

       ...
   }
}

我需要两个不同的单例...每个控制器一个,其中 MyLoggerClass 的构造函数参数 loggerName 必须根据控制器更改。所以,我需要两个实例:

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

这是正确的方法吗?我该如何解决我的问题?

谢谢

【问题讨论】:

  • 是的,我已经看到了那个例子......我已经尝试实现它,但有些事情我做不到......现在我不记得了,因为我做了不同的重试...... . 我已经用这行代码解决了:(pi, ctx) =&gt; ctx.ResolveNamed(pi.Member.DeclaringType.FullName, targetType)
  • 如果你已经解决了,你应该发布你自己问题的答案,这样人们就不会跳到这里继续试图回答你。很高兴你成功了!

标签: autofac named-parameters constructor-injection


【解决方案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)
    );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多