Autofac在运行时使用构造函数参数解析通用类型

时间:2018-09-25 10:29:36

标签: c# .net dependency-injection autofac

我有一个通用类Logger<TProvider> where TProvider : ILogProvider,我想使用Autofac配置依赖项注入。

此类还具有一个构造函数:

public Logger(LogType loggerType)

目前这样使用:

var logger = new Logger<Log4NetLogProvider>(LogType.CMS);

我想知道这是否可能是依赖项注入,还是由于需要类型/构造函数参数而无法实现?

我知道RegisterGeneric方法,例如:

builder.RegisterGeneric(typeof(Logger<>)).AsSelf()

我想知道如何告诉autofac传入了哪个TProvider并提供构造函数参数LogType?还是这不是DI的好候选人?

2 个答案:

答案 0 :(得分:0)

注册类型时,您可以尝试使用WithParameter扩展名

//using named parameter
builder.RegisterGeneric(typeof(Logger<>))
    .AsSelf()
    .WithParameter("loggerType", LogType.CMS);

//OR - using typed parameter
builder.RegisterGeneric(typeof(Logger<>))
   .AsSelf()
   .WithParameter(new TypedParameter(typeof(LogType), LogType.CMS));

引用Passing Parameters to Register

答案 1 :(得分:0)

我解决您的问题的方式如下:

我在完成通用类的注册。

builder.RegisterGeneric(typeof(Logger<>));

之后,我用如下类型注册它:

 builder.RegisterType<Logger<TProvider>>()
                .As<ILogger<TProvider>>()
                .WithParameter("loggerType", LogType.CMS);

或者您也可以使用Typed参数来做到这一点:

builder.RegisterType<Logger<TProvider>>()
                    .As<ILogger<TProvider>>()
                    .WithParameter(TypedParameter.From(LogType.CMS)));

将TProvider替换为参数,即

builder.RegisterType<Logger<LogProvider>>()
                        .As<ILogger<LogProvider>>()
                        .WithParameter(TypedParamater.From(LogType.CMS)));