使用 autofac 根据上下文将构造函数值传递给相同的实现参数
Passing constructor value to same implementation parameters according the context with 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) { ... }
...
}
}
我需要两个不同的单例...每个控制器一个,其中 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....
}
这是正确的做法吗?我该如何解决我的问题?
谢谢
我修改了扩展方法如下:
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)
);
}
我有一些 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....
}
这是正确的做法吗?我该如何解决我的问题?
谢谢
我修改了扩展方法如下:
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)
);
}