2

私は Windsor で構築されたアプリケーションを持っています。このアプリケーションには機能があり、すべてのコンポーネントは構成も含む xml 内に手動で登録されています。これは例です:

<component type="type">
  <parameters>
      [...]
  </parameters>
</component>

コンポーネントをリファクタリングし、機能ごとに 1 つのインストーラーであるウィンザー インストーラーに分割することにしました。私の問題は、各インストーラー内に登録されたコンポーネントの構成をどこに置くかを決定することです。

この決定を行う前は、ユーザーはほとんどが xml の parameters 要素内で適切なコンポーネントの構成を見つけることができ、それを機能させるためにワイヤ ロジックを記述する必要はありませんでした。

私はもうそのような自動化を持っていないように見えるので、今は少し混乱しています. アプリケーションのインストーラーを xml で宣言することにしたので、この構成を次のように installr 要素内に配置できれば完璧だと思います。

<installers>
 <install assembly="myassembly">
  <parameters>
    [...]
  <parameters>
 </install>
</installers>

Windsor がこの構文をサポートしているかどうかはわかりません。もしそうなら、インストーラー内からどのようにアクセスできるのか、コンポーネントやサービスに接続する方法が気になります。

別の受け入れ可能な代替手段は、私の機能のすべての構成を含むコンポーネントを作成して xml に登録することです。

<components>
 <component type="featureConfiguration">
  <parameters>
  </parameters>
 </component>
</components>

この場合、コンストラクターで引数としてそのような型を受け取るようにコンポーネントをリファクタリングする必要があると思いますが、直接プロパティを取得する前、つまり、コードを見てコンポーネントの依存関係が何であるかを正確に知る前に、この新しいフォームを使用して、構成全体を渡しますが、このコンポーネントまたはそのコンポーネントで使用されている構成の特定のプロパティがわかりません。

この 2 番目の解決策を使用し、この混乱を避けるには、構成全体をサブコンポーネントに渡すことを避け、その単一のプロパティで機能させる必要がありますが、この構成コンポーネントのプロパティと構成コンポーネントのプロパティの間の接着剤を見つける必要があります。インストーラーのコンポーネントとサービス。

コンポーネントではなく、xml のプロパティ要素内にすべての構成を配置することもできると思います。

<properties>
 <featureConfiguration>
   [property list]
 </featureConfiguration>
</properties>

しかし、ここでも、リスト内の個々のプロパティとコンポーネントのプロパティとの間の接着剤を見つける必要があります。

どんな助けでも大歓迎です。

ありがとうございました。

4

1 に答える 1

2

必要なコンポーネントのパラメーター化のレベルによっては、この混合ソリューションが役立つ場合があります。つまり、インストーラーでコンポーネントの登録を実行し、windsor 構成ファイルでコンポーネントのパラメーターを設定できます。これは、Windsor に他のすべての依存関係を処理させながら、いくつかのコンポーネントでパラメーター化が必要な場合に役立ちます。

例: 次のコンポーネントがあるとします。

public class MyComponent
{
    public MyComponent(MyDependency dependency, string stringParameter, DateTime dateParameter)
    {
        this.Dependency = dependency;
        this.StringParameter = stringParameter;
        this.DateParameter = dateParameter;
    }

    public DateTime DateParameter { get; set; }

    public string StringParameter { get; set; }

    public MyDependency Dependency { get; set; }
}

public class MyDependency
{
}

次に、次のインストーラーを使用してそれらを登録できます。

public class MyInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<MyComponent>().Named("MyComponent"));
        container.Register(Component.For<MyDependency>());
    }
}

MyComponentに設定された、コンポーネントの一意の名前について明示していることに注意してください。ただし、デフォルトのフルネームも使用できます。

ウィンザー構成ファイルは次のようになります。

<configuration>
    <components>
        <component id="MyComponent">
            <parameters>
                <stringParameter>Some string</stringParameter>
                <dateParameter>2013/09/25</dateParameter>
            </parameters>
        </component>
    </components>
</configuration>

これで、すべてをまとめてラップできます。

WindsorContainer container = new WindsorContainer();
container.Install(Configuration.FromXmlFile("windsor.config"));
container.Install(FromAssembly.This());

Install メソッドを呼び出す順序が重要であることに注意してください。最初に構成ファイルの設定をインストールする必要があります。

于 2013-09-25T13:11:36.680 に答える