5


2

私はconnectionsStringのようなプロパティも.Net設定セクションの下に保持されている多くの城xml設定を持っています。

コンテナを使ってプロパティを読み出せるようにしたいのですが、それを実行するメカニズムがわかりません。

すなわち

データソース= MyServer;初期カタログ= YadaYada;ユーザーID = me;パスワード= IAmGod

…​

明らかにプロパティはそこにコンポーネントの依存関係があるのでそこにあります。 コンポーネントは解決できますが、プロパティは解決できません。

確かに、私がコンポーネントを新規作成して、それに挿入されたプロパティー・キャッスルを読み取ることも、単に名前と値のペアを保持するためだけに特化したコンポーネントですべてのプロパティーをラップすることもできます。 しかし、私は単純なcontainer.resolve( "property.connectionstring")記法があると考えていたでしょう。

*編集値下げにはあまり良くありません、上記はxmlセクションであることを意図していました。

2 Answer


2


あなたはこれをいくつかの異なる方法で行うことができます - 強く型付けされた解決策のための明白なアプローチはカスタム設定クラスを実装し、そしてウィンザー設定のプロパティとクラスのプロパティを結び付けることです。コンストラクタの引数はおそらく最善でしょう、そのため他の開発者はそれらを更新できるとは思わない) - あなたが指摘したように2つを同期させるために少し作業があります。 このコンポーネントのウィンザー設定/クラス定義を生成するために設定ファイルを解析するための小さなツールを書くかもしれないので、それを保守する必要はありません。

もう1つの方法は、既存の設定インタプリタを使用して設定の解析中に収集されたプロパティを公開することです - これらを取得するには少し手間がかかります(ただし多すぎません)。 私はあなたがこれを行うことができると思います:

  • AddProperty(XmlElement要素)への呼び出しをキャプチャし、それを独自のプライベート辞書に格納するIXmlProcessorEngineを実装したデコレータを作成します。

  • XmlProcessorをあなた自身の実装に置き換えてください。 クラスのソースコードをコピーしてから、実際の作業を行っているDefaultXmlProcessorEngineインスタンスをデコレータで囲むようにコンストラクタを変更すると、さまざまなadd-property呼び出しが記録されます。

  • XmlInterpreterから継承し、ProcessResourceメソッドをオーバーライドしてXmlProcessorの置き換えを呼び出します。

  • デコレータに格納されているプロパティをどのように取得するかを決めます。おそらくXmlInterpreterとXmlProcessorからコンストラクタを介して渡される辞書を使って設定します。

残念ながら、これらのプロパティは解釈段階でしか使用されないため、設定ストアには渡されません。さらに、タイプコンバータが解析のこの段階で呼び出されるとは思わないので、値は文字列になります。しかし少なくともif / elseなど 条件ステートメントは、includeと同様に正しく評価されます。


1


あなたはこれについて間違ったやり方で考えていませんか?

確かに、接続文字列を使用しているオブジェクトは、コンストラクタ内にConnectionStringプロパティを持ち、依存関係はconfigのcomponentsセクションにある何かでそこにプッシュされるべきです:

#{connectionString}

そうすることで、接続文字列が自動的に渡され、コンポーネントはコンテナについてまったく知る必要がなくなります - 分離され、まとまりがあります。