2011-10-17 3 views
1

私は私のアプリケーションでCastle.Windsorを使用しています。私のコンポーネントとそのパラメータは、app.configファイル内で設定されます。しかし、私はまた、コマンドライン引数でパラメータを渡すことができるようにしたい。つまり、cmd-args > config-argsを意味します。私はcontainer.Resolve<Class>(dictionary)を使ってみました。しかし、動作しませんでした(config-argsが使用されています)。不思議なことに、私が匿名のタイプを使用すると、うまくいきます。ウィンザー引数の辞書で解決する

ありがとうございます。気紛れだ

EDIT

public class TestB 
{ 
    public string A { get; set; } 
    public string B { get; set; } 

    public TestB(string a) 
    { 
     A = a; 
     //B = b; 
    } 
} 

     [Test] 
    public void Test() 
    { 

     var dictionary = new Hashtable 
         { 
          { "a", "b" } 
         }; 

     var anonymousType = new 
          { 
           a = "b" 
          }; 

     WindsorContainer container = new WindsorContainer(new XmlInterpreter()); 

     var opt1 = container.Resolve<TestB>(anonymousType); 
     var opt2 = container.Resolve<TestB>(dictionary); 

     Assert.That(opt1.A == "b"); 
     Assert.That(opt2.A == "b"); 
    } 

。どちらのアサーションも成功します。しかし、opt1とopt2のレゾルバを交換すると、アサーション2は失敗します。

+0

あなたのコードを辞書と匿名タイプで表示できますか? – svick

答えて

5

その理由は、依存関係が二倍に設定されていることである: - 最初の.ctorパラメータ として - を再度としての性質

ウィンザーん -caseに敏感なパラメータ名のマッチングマッチングあなたのxml configからのパラメータと、匿名の型とインライン引数からのパラメータが、期待通りにxmlよりも優先されます。

Hashtableとし、と設定してください。と大文字と小文字が区別されます。

したがって、それはプロパティに設定され、Hashtableは値を提供しないので、XMLから1つを取得します。これはa .ctor引数と一致します。私はOPT1とOPT2 resolvationsを交換する場合

について

、アサーション2は失敗します。

あなたのXML設定を投稿しませんでしたが、私は、その場合にはResolveへの2回目の呼び出しは、ちょうどあなたの最初の呼び出しによって構築されたオブジェクトを与える、コンポーネントのライフスタイルがシングルトンである疑いがあり、どんな引数を渡します無視されます。

通常、おそらく、セッターは.ctorで設定されているプロパティに公開されず、読み込み専用にしておくことをお勧めします。

+0

私は静かではないのですが、 'set'のアクセシビリティ修飾子をprivateに変更した後で動作します。通常私は常にプライベートとしてプロパティ設定者を宣言しますが、これは私のために働くことができるかどうか、それは単なるテストでした:)ありがとう! – Matthias

+0

プロパティセッターを非公開にすると、ウィンザーはそれを設定しようとしません。したがって、xmlの値は、辞書から設定された値を上書きしません。 –

関連する問題