2009-07-31 10 views
5

をオートワイヤリングする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)); 
+2

あなたの質問はあまり明確ではありません。オートファックのユーザーではない私たちのために、p、config、TypedParameter.Fromとcontainer.Resolveの宣言を表示できますか?また、どのように「動作しませんか」 - コンパイル時のエラーを指定してください。例外? –

+0

は、例えば、 LINQPad(リファレンスAutofac.dll) –

答えて

18

だけなので、消費者のウォンのための決意 コールにコンフィグのパラメータを渡し、あなたが解決している の直接実装サービスに関連する解決するために渡されたパラメータ仕事はありません。 これを回避する方法は、お使いに消費者の登録を変更することです:

残念ながら
builder.Register((c, p) => new Consumer(c.Resolve<Config>(p))); 
+0

builder.Register((c、p)=>新しいコンシューマー(c。Resolve (p))); これはperfetctを動作させるためです!ありがとうニコラス! –

+3

+1最後に、autofacを知っている人:-) – galaktor

+4

"最終的にはautofacを知っている人"というのは、確かに作者を意味しています:) – uriDium

0

Autofacは明らかにレゾールしようとしていますディクショナリ自体が解決可能な型であると仮定して、Configクラスのパラメータを設定します。私はそれを行う方法についてautofacの構文を知らない。しかし、おそらくConfig Typeを登録するときにはもっと多くのステップを実行する必要があります。 g。新しいディクショナリに渡す代理人を与えます。ここAutofacメーリングリストからの回答を繰り返す

+0

あなたは正しいです!しかし、次の問題が発生します。もし私がConfigを次のように登録すると、 builder.register ((c、p)=>新しいConfig(p.TypedAs >())); 解決時間にpが空です! –

+0

Hm。たぶんautofacに代理人を与えるためですが、デリゲートには実行時に辞書がまだありません。あなたの代理人で実際に新しいディクショナリを用意してみてください(このようなことはわかっていますが、私はまだオートファックのための正確なフォーラムを知らない)。 )))); – galaktor

+0

は、常にConfigに空の辞書を与えませんか?解決時にどのような議論が引き継がれるのでしょうか? –

0

、AutofacなどのIoCコンテナは、「私の心のモジュールをお読みください」を装備付属していません。

あなたがしようとしていることは、基本的には「ここに含まれるタイプのうちの1つが辞書を必要としていることを知っています。タイプのサービスが必要です」Consumer、あなたはそれが何であるかと思って、ちょうど正しいこと? "をしてください。

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

+0

私の最初の試みは純然たるものでしたが、パラメータがそれは働いていた登録? –

+0

AutoFacはそれを理解できるはずですが、AutoFacでサービスとしてパラメータをあらかじめ登録する必要があります。個人的には、コンストラクタパラメータを持つサービスはお勧めしません。実装の詳細を使用するコードにリークするので、必ず漏洩するサービスです。後でサービスを置き換えるのが難しくなります。例として、構成ファイル名を渡すサービスを考えてください。後で、代わりにデータベースから構成を読み取るサービスを使用する場合はどうしますか? –

+0

はい、私の解決策にスポットはありませんが、問題は、私はユーザーがどのタイプのサービスを使用するかを設定できるようにしたいということです。しかし、そのサービスもまた別の設定が必要です。したがって、これらのサービス設定はIDictionary として渡されます。私はもっと良い解決策を望んでいますが、この工場は今のところ私の最高の試みです。 –

関連する問題