2011-06-23 26 views
1

私は、次のインタフェースを介して、私のクラスの一部にConfigurationProviderを注入するユニティフレームワークを使用しています:Unity DIでコマンドライン引数を使用するための戦略?

interface IConfigurationProvider<T>{ 
    T GetConfiguration(); 
} 

その後、Unityでの私のブートストラップでは、

container.RegisterType(typeof (IConfigurationProvider<DongleConfiguration>), 
           typeof (DongleConfigurationProvider)); 

これは良いされています今までの戦略&は、私がさまざまな実装のために異なる設定プロバイダを定義できるようにしました&テスト。今、私はCTORにargsパラメータに沿って渡すために私を必要とする、プロバイダのいずれかが、configオブジェクトを設定するには、コマンドライン引数を使用したい:

class ProblematicConfigurationProvider : IConfigurationProvider<ProblematicConfiguration> { 
    ... 
    public ProblematicConfigurationProvider(string[] args) { ... } 
    ... 
} 

私は私が使用できることを読みましたRootObjectを解決した後、私はラインの下の依存関係を解決するために、「すべての道を」DIを使用し、容器に頼っています、しかし

var configObj = container.Resolve<IConfigurationProvider<ProblematicConfiguration>>(new ParameterOverride("args", args)); 

をか私のトップレベルのクラスが何であれ:ParameterOverrideは、次のようなオプションのctorの引数を供給するための。私の質問は、どうすれば私の依存グラフのどこかに深く埋もれてしまった場合に、今解決したconfigObjオブジェクトをどうすれば使えるのですか? Resolveの別の呼び出しで解決されたオブジェクトを使用するにはどうすればよいですか?それはParameterOverrideの同様の使い方ですか?パラメータのオーバーライドを設定する方法はありますか& Unityは実際にconfigObjをインスタンス化せずにそれを使用していますか?

答えて

3

私はこれを別の方法で行います。 CommandLineArgumentsクラスをプロジェクトに追加します。これはコマンドライン引数だけをラップします。あなたのコンテナの初期化の一環として、コンテナとその登録:

container.RegisterInstance(new CommandLineArguments(args)); 

を次に、あなたのConfigurationProviderは[] CommandLineArgumentsの依存関係ではなく、文字列を持っている必要があります。そこから、パラメータオーバーライドを使用せずに自然に「すべてをダウン」するだけで解決するはずです。

あなたのコマンドライン引数は変更されないので、私の意見ではこれはずっと簡単です。

注:私はCommandLineArguments型を使用しています。これは、何が起こっているのかをより詳しく説明するためです。あなたはコンテナに文字列[]を直接登録することができますが、それは私には少し気になり、おそらくあなたが期待していないどこかでコマンドライン引数を注入する可能性があります。

+0

このようにはるかに良い感じです。ありがとう! –

関連する問題