根据上下文将构造函数的值传递给相同的实现参数,使用autofac。

问题描述 投票:0回答:1

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

       ...
   }
}

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

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

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

谢谢您

autofac named-parameters constructor-injection
1个回答
0
投票

我修改了如下的扩展。

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)
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.