5

私は、接続文字列のようなプロパティも.Net構成セクションの下に保持されている城のxml構成をたくさん持っています。

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

すなわち

<castle>
  <configuration>
    <properties>
      <connectionString>Data Source=MyServer;Initial Catalog=YadaYada;User      ID=me;Password=IAmGod</connectionString>
     </properties>
    <components>

...

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

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

*編集マークダウンはあまり得意ではありません。上記はxmlセクションであることが意図されていました。

4

2 に答える 2

2

これを行う方法はいくつかあります。強く型付けされたソリューションの場合、明らかなアプローチは、カスタム構成クラスを実装してから、クラスのプロパティをウィンザー構成のプロパティと結び付けることです (一連の読み取り専用プロパティを使用)。コンストラクター引数がおそらく最適であるため、他の開発者はそれらを更新できるとは考えていません) - あなたが指摘したように、2 つを同期させるには少し作業が必要です。構成ファイルを解析して、このコンポーネントのウィンザー構成/クラス定義を生成するための小さなツールを作成すると、それを維持する必要がなくなります。

別の代替手段は、既存の構成インタープリターを使用して、構成の解析中に収集されたプロパティを公開することです。これらを取得するには、少し作業が必要です (ただし、それほど多くはありません)。次の方法でこれを行うことができると思います:

  • AddProperty(XmlElement 要素) への呼び出しをキャプチャし、独自のプライベート ディクショナリに要素を格納する IXmlProcessorEngine を実装するデコレータを作成します。
  • XmlProcessor を独自の実装に置き換えます (つまり、クラスのソース コードをコピーし、コンストラクターを変更して、実際の作業を行っている DefaultXmlProcessorEngine インスタンスの周りにデコレーターをラップするようにします。これにより、さまざまな add-property 呼び出しが記録されます)。
  • XmlInterpreter から継承し、ProcessResource メソッドをオーバーライドして、XmlProcessor の置換を呼び出すようにします。
  • デコレーターによって格納されているプロパティを取得する方法を決定します。おそらく、XmlInterpreter と XmlProcessor からコンストラクターを介して渡される辞書で構成されている可能性があります。

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

于 2008-10-24T02:13:41.670 に答える
1

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

確かに、接続文字列を使用しているオブジェクトには、コンストラクターに ConnectionString プロパティが必要であり、構成のコンポーネントセクションに次のようなものが含まれている依存関係がそこにプッシュされます。

<component type="SessionManager">
  <parameters>
    <connectionString>#{connectionString}</connectionString>
  </parameters>
</component>

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

于 2008-10-15T14:06:51.610 に答える