3

ListCreator構成したいクラスがあるとしましょう。ソート順とテーブルの出力方法を教えてもらいたいです。したがって、ブール値のsortDescendingプロパティと、TableWriterによって実装されるインターフェイスがありますPdfTableWriter(ただし、によってもXlsTableWriter)。この例では、構成と DI は密接に関連していると思います。このSpring(疑似)の例のようなものを書きたいと思います:

<beans>
    <bean id="ListCreator" class="ModularListCreator">
        <property name="tableWriter">
            <ref local="TableWriter"/>
        </property>
        <property name="sortDescending">
            <value>true</value>
        </property>
    </bean>
    <bean id="TableWriter" class="PdfTableWriter"> </bean>
</beans>

現在、Spring はこれを実行できますが、Weld & Guice は実行できないようです。たとえば、Weld を使用すると、beans.xml で代替を選択できますが、アプリケーション全体に対してのみ選択できます。ListCreator1 つを PDF 用に、もう 1 つを XLS 用に同時に使用したい場合はどうすればよいですか?

現時点では Weld と Guice の範囲がわかりません。構成の多くが許可されていないように見えるからです。new独自のファクトリを作成または実装する必要性を軽減するだけのようです。たとえば、EJB インジェクションは同じことを行いますが、これは素晴らしいことですが、構成部分全体はどこにありますか (実際に必要なパラメーターを使用してどのインスタンスをどこで選択するか)。

要点を言えば、Spring はオーバーヘッドのように見えるので使用したくありません。私はむしろ、JSR によって指定された、せいぜいクリーンで小さいものを使用します。助言がありますか?

4

3 に答える 3

0

InPUTは、柔軟な説明ベースのソリューションが必要な場合の方法を提供します。例全体を作成し、例のセクションに追加しました。

コードは最小限です:

Design config = new Design("config.xml");
ListCreator creator = config.getValue("ListCreator");

InPUT構文の設定を含むconfig.xmlInPUTデザインがあると仮定します。

<SValue id="ListCreator">
    <NValue id="SortDescending" value="false"/>
    <SValue id="TableWriter" value="Xls"/>
</SValue>

これを機能させるには、次のようにデザインスペースを定義する必要があります。

<SParam id="ListCreator">
    <NParam id="SortDescending" type="boolean" />
    <SParam id="TableWriter">
        <SChoice id="Xls"/>
        <SChoice id="Pdf"/>
    </SParam>
</SParam>

これで、プログラミング言語に依存しないデザインスペースをコードマッピングのJava実装に合わせて調整できます。

<Mapping id="ListCreator" type="test.ListCreator" constructor="TableWriter SortDescending"/>
<Mapping id="ListCreator.TableWriter" type="test.TableWriter"/>
<Mapping id="ListCreator.TableWriter.Xls" type="test.XlsTableWriter"/>
<Mapping id="ListCreator.TableWriter.Pdf" type="test.PdfTableWriter"/>

ここから、コードに触れることなく、自由意志で拡張およびカスタマイズできます。複数のListCreatorインスタンスの場合について言及しました。次の3つの変更を行う必要があります。

1)デザインスペース:

<SValue id="ListCreator" type="[]">

2)デザイン(例):

<SValue id="ListCreator">
    <SValue id="1">
        <NValue id="SortDescending" value="true"/>
        <SValue id="TableWriter" value="Pdf"/>
    </SValue>
    <SValue id="2">
        <NValue id="SortDescending" value="false"/>
        <SValue id="TableWriter" value="Xls"/>
    </SValue>
</SValue>

3)代わりに配列を受け取る準備をしてください(コード):

ListCreator[] creators = config.getValue("ListCreator");

記述子の数と選択肢を決定します。エントリは定義された順序で到着します。これは、複数のディメンション(「[] [] []」など)でも同様に機能します。将来、さらにパラメーターを使用して代替のテーブルライターを追加したり、呼び出し側でコードを変更せずに現在のパラメーターを変更したりできます。クラスがすべて利用可能であることを確認し、それをテストしてください。エラー(タイプミス)の原因がいくつかあります。

于 2012-10-12T11:44:55.700 に答える
0

Guice は、実際に構成に多くの力を与えてくれます。私があなたを正しく理解していると仮定すると、モジュールでプロバイダー メソッドを使用して、Guice でこれを行う 1 つの方法の簡単な例を次に示します。

protected void configure() {
  bind(TableWriter.class).to(PdfTableWriter.class);
}

@Provides
protected ListCreator provideListCreator(TableWriter tableWriter) {
  ModularListCreator result = new ModularListCreator();
  result.setTableWriter(tableWriter);
  result.setSortDescending(true);
  return result;
}

setSortDescendingバインディング アノテーションを使用するなど、他の方法もあります。

@Inject public void setSortDescending(
    @Named("sortDescending") boolean sortDescending)

次に、そのプロパティをバインドします。

protected void configure() {
  bind(TableWriter.class).to(PdfTableWriter.class);
  bindConstant().annotatedWith(Names.named("sortDescending")).to(true);
  bind(ListCreator.class).to(ModularListCreator.class);
}
于 2011-07-28T17:59:03.190 に答える
0

CDI については、Seam Solder をチェックしてください。管理対象 Bean を xml ファイルから簡単に構成する機能が追加されます。Seam チームと Weld チームの間の緊密な関係から判断すると、このメカニズムは将来の JSR になる可能性が高いでしょう。

于 2012-02-26T18:04:06.030 に答える