Autofac参数传递和自动装配

Car*_*erg 6 c# dependency-injection autofac

无法理解在Autofac中传递的参数,以下代码不起作用:

class Config {
    public Config(IDictionary<string, string> conf) {}
}

class Consumer {
    public Consumer(Config config) {}
}

void Main()
{
    var builder = new Autofac.Builder.ContainerBuilder();
    builder.Register<Config>();
    builder.Register<Consumer>();
    using(var container = builder.Build()){
        IDictionary<string,string> parameters = new Dictionary<string,string>();
        var consumer = container.Resolve<Consumer>(Autofac.TypedParameter.From(parameters));
    }
}
Run Code Online (Sandbox Code Playgroud)

抛出:

DependencyResolutionException: The component 'UserQuery+Config' has no resolvable constructors. Unsuitable constructors included:
Void .ctor(System.Collections.Generic.IDictionary`2[System.String,System.String]): parameter 'conf' of type 'System.Collections.Generic.IDictionary`2[System.String,System.String]' is not resolvable.
Run Code Online (Sandbox Code Playgroud)

但以下代码确实有效:

IDictionary<string,string> parameters = new Dictionary<string,string>();
var config = container.Resolve<Config>(Autofac.TypedParameter.From(parameters));
var consumer = container.Resolve<Consumer>(Autofac.TypedParameter.From(config));
Run Code Online (Sandbox Code Playgroud)

Nic*_*rdt 19

在这里重复Autofac邮件列表的答案:

传递给Resolve的参数仅与您正在解析的服务的直接实现相关,因此将Config的参数传递给Consumer的解析调用将不起作用.解决这个问题的方法是将您的消费者注册更改为:

builder.Register((c, p) => new Consumer(c.Resolve<Config>(p))); 
Run Code Online (Sandbox Code Playgroud)

  • 通过"终于有人知道autofac"你的意思是作者,是的确定:) (4认同)