2016-04-19 3 views
0

私は次のように非常にシンプルなインターフェイスがあります。Guiceで複数のパラメータを分岐させるクラスのファクトリを単純に処理する方法は?

public interface IDataSource<T> { 
    Observable<T> observable(); 
} 

は今、私はそれの複数の実装を持つことになりますが。これらの実装のそれぞれは、さまざまなパラメータ(さまざまなストレージオブジェクト:JDBC、Cassandra、Redis ...)に依存する場合があります。たとえば、私は持っているでしょう:

public class CassandraDataSource implements IDataSource<MyCassandraObject> { 
    @Inject 
    public CassandraDataSource(Keyspace ks) { 
     // ... 
    } 
} 

public class OtherCassandraDataSource implements IDataSource<MyOtherCassandraObject> { 
    @Inject 
    public OtherCassandraDataSource(Keyspace ks) { 
     // ... 
    } 
} 

public class JDBCDataSource implements IDataSource<MyJdbcObject> { 
    @Inject 
    public JDBCDataSource(Database db) { 
     // ... 
    } 
} 

など。

私が望むのは、適切なIDataSourceを返すファクトリを呼び出せるように、それぞれの文字列を参照することです。そのように振る舞うと何か:

public class DataSourceFactory { 
    public static final Map<String, Supplier<IDataSource<?>>> map = new HashMap<>(); 

    @SuppressWarnings("unchecked") 
    public <T> IDataSource<T> get(String ref) { 
     return (IDataSource<T>) map.get(ref).get(); 
    } 
} 

私は私の工場にパラメータ(または直接フィールドインジェクション)としてN Providersを与える(N Iが使用IDataSourceの数である)ことができ、マップストリングコンストラクタのものとかgetメソッドのスイッチを使用しますが、これは10から20に達すると非常に混乱します(以上)

私が見落としている簡単な解決策がありますか?あなたは工場を持っている必要がある場合

おかげ

答えて

0

は、その後、as in this question NO-マニュアル工場は、おそらくあなたが得ることができる最善の方法です。

しかし、すべてのIDataSource実装を異なるバインディングアノテーションを持つIDataSourceにバインドすると、工場をスキップして@Source("foo") IDataSourceを注入して、必要なインスタンスを返すことができます。 Stringと実装の間の構成はまだどこかで生きていなければなりませんが、あなたが望むならGuiceモジュールで生きることができます。また、Injectorを注入して互換性のあるアノテーション実装を提供することで、Guiceを擁護するDataSourceFactoryのようなファクトリを作成することもできます。

補足として、DataSourceFactoryに注意してください。 getは、型パラメータTに値を指定する安全な方法を提供しません。

関連する問題