6

无法理解在 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));
4

3 回答 3

19

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

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

builder.Register((c, p) => new Consumer(c.Resolve<Config>(p))); 
于 2009-08-01T20:35:09.323 回答
0

Autofac 显然试图在 Dictionary 本身是可解析类型的假设下解析您的 Config 类的参数。我不知道如何做到这一点的 autofac 语法。但是在注册 Config 类型时您可能需要做更多的步骤,例如给它一个在新字典中传递的委托。

于 2009-07-31T11:14:21.433 回答
0

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

你想要做的基本上是说“我知道这里涉及的一种类型需要一本字典,我需要一个消费者类型的服务,你能不能试着弄清楚我在做什么,然后做正确的事?”。

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

于 2009-08-01T20:40:23.977 回答