5


0

Autofacに渡されるパラメータに頭を悩ますことはできません、次のコードは機能しません:

クラスConfig {public Config(IDictionary conf){}}

クラスConsumer {public Consumer(Config config){}}

void Main(){var builder = new Autofac.Builder.ContainerBuilder();} builder.Register(); builder.Register(); using(var container = builder.Build()){IDictionary parameters = new Dictionary(); var consumer = container.Resolve(Autofac.TypedParameter.From(parameters)); }}

それがスローされます:

DependencyResolutionException:コンポーネント 'UserQuery Config'に解決可能なコンストラクタがありません。 不適切なコンストラクタが含まれています。 .String] 'は解決できません。

しかし、次のコードはうまくいきます:

IDictionaryパラメータ= new Dictionary(); var config = container.Resolve(Autofac.TypedParameter.From(parameters)); var consumer = container.Resolve(Autofac.TypedParameter.From(config));

3 Answer


18


ここでAutofacメーリングリストからの答えを繰り返します。

Resolveに渡されるパラメータは、解決しようとしているサービスの直接の実装者にのみ関連しているので、ConfigのパラメータをConsumerのresolve呼び出しに渡してもうまくいきません。 これを回避するには、コンシューマ登録を次のように変更します。

builder.Register((c、p)=> new Consumer(c.Resolve(p)));


0


Autofacは明らかにあなた自身のConfigクラスのパラメータを解決しようとしていますが、それはDictionaryそのものが解決可能な型であるという前提の下にあります。 その方法に関するautofacの構文がわかりません。 しかし、あなたはおそらくConfigタイプを登録するとき、もっと多くのステップを実行する必要があります。 g。 新しい辞書を渡すデリゲートをそれに渡します。


0


残念ながら、AutofacのようなIoCコンテナには「どうぞ私のマインドモジュールを読んでください」という機能が備わっていません。

あなたがやろうとしていることは基本的に言っていることです。正しいことをします_?"。

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