2012-02-28 11 views
0

私たちはデータベースとしてMongo Dbを使用しています。既存のアプリケーションに複数のデータベースを追加する(1つではなく)

次のJAX-RSサービス(またはその他のステートレス/ステートフルEJB)がある場合。

問題:2つ以上のデータベースを使用する必要がありますが、現在のソースでは不可能と思われます。私たちは現在注入されたDBを使用していますが、もしの実装やそれ以外のものを使用しているのであれば、同じ問題を抱えています。ユーザー/アプリケーションに応じて、クラスの異なるインスタンスを注入するための統合ソリューションがいくつかあります。私たちは、

@Inject 
    public Map<String, DB> databases; 

を試すことができますが、我々は、データベースのこれらのマップを処理するためにあまりにも多くの条件ロジックを追加する必要があります。

答えて

1

DIフレームワークでこれを行う典型的な方法は、修飾子を使用することです。 CDIを使用している場合は、プロデューサと修飾子アノテーションの組み合わせでこれを実現します。私はこれをコンパイル時に知られているいくつかのインスタンスの1つを選択するための良い方法だと思っています。実行時の情報に基づいてインスタンスを取得する必要がある場合は、ファクトリを使用する必要があります。 CDIについては

は、ここにいくつかの擬似コードです:

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface PrimaryDatabase { 
} 

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface SecondaryDatabase { 
} 

public class DatabaseProducer { 

    @Produces 
    @PrimaryDatabase 
    public DB getPrimaryDB() { 
     // ... 
    } 

    @Produces 
    @SecondaryDatabase 
    public DB getSecondayDB() { 
     // ... 
    } 
} 

public class GetSomeObject{ 

    @Inject 
    @PrimaryDatabase 
    public DB primaryDB; 

    @Inject 
    @SecondaryDatabase 
    public DB secondaryDB; 
} 
関連する問題