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 の解決呼び出しに渡すことはできません。これを回避するには、消費者登録を次のように変更します。

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

残念ながら、AutofacのようなIoCコンテナには、「私の心のモジュールを読んでください」が装備されていません。

あなたがやろうとしていることは、基本的に「ここに関係するタイプの1つに辞書が必要であり、タイプConsumerのサービスが必要なことを知っています。私が何をしているのかを理解してみてください。正しいことをしますか?」

1つのサービスを解決し、パラメーターを指定すると、そのパラメーターはその特定のサービスで使用されようとします。コンテナは、そのパラメータ値を依存関係に伝播しようとはしません。

于 2009-08-01T20:40:23.977 に答える