Autofac参数传递和自动装配

时间:2009-07-31 09:36:27

标签: 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));
    }
}

抛出:

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.

但以下代码 工作:

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));

3 个答案:

答案 0 :(得分:19)

在此重复Autofac邮件列表中的答案:

传递给Resolve的参数只与直接实现者有关 您正在解析的服务,因此将Config的参数传递给解析 呼吁消费者不会工作。 解决这个问题的方法是将您的消费者注册更改为:

builder.Register((c, p) => new Consumer(c.Resolve<Config>(p))); 

答案 1 :(得分:0)

Autofac显然试图在假设Dictionary本身是可解析类型的情况下解析Config类的参数。我不知道如何做的autofac语法。但是,在注册Config类型时,您可能需要执行更多步骤,例如: G。给它一个传递新词典的代表。

答案 2 :(得分:0)

不幸的是,像Autofac这样的IoC容器没有配备“请阅读我的思维模块”。

你要做的是基本上说“我知道这里涉及的其中一种类型需要字典,我需要一种消费类型的服务,你能不能试着弄清楚我正在服用的是什么关于并且只做正确的事情?“。

如果您解析了一项服务并指定了参数,那么将尝试将该参数用于该特定服务。容器不会尝试将该参数值传播到任何依赖项。