私は現在、次のクラス/インターフェースをレイアウトしています。タイプは、実装T
から返されるデータの形式を表します。DataProvider
ファクトリを使用しているため、型情報を に添付する必要はありませんMyStreamingOutput
。HK2
に注入するために使用しDataProviderFactory
ていMyStreamingOutput
ます。
public interface DataProvider<T> {
public T next() { ... }
...
}
public final class SQLDataProvider<T> {
public SQLDataProvider(final String query, final RowMapper<T> rowMapper) { ... }
}
public interface DataProviderFactory {
public <T> DataProvider<T> getDataProvider(final String query, final RowMapper<T> rowMapper);
...
}
public final class SQLDataProviderFactory {
public <T> DataProvider<T> getDataProvider(final String query, final RowMapper<T> rowMapper) {
return new SQLDataProvider<T>(query, rowMapper);
}
}
public final class MyStreamingOutput implements StreamingOutput {
public MyStreamingOutput(final DataProviderFactory dpFactory) { ... }
@Override public void write(final OutputStream outputStream) throws IOException { ... }
}
これはすべてうまくいきます。今、私は の単体テストをセットアップしようとしMyStreamingOutput
ていますが、いくつかの障害に遭遇しています。テスト目的で次の追加クラスを作成しました。
public final class DataProviderFactoryStub implements DataProviderFactory {
private final DataProvider dataProvider;
public DataProviderFactoryStub() {
this.dataProvider = new DataProviderStub();
}
public DataProviderFactoryStub(final DataProvider dataProvider) {
this.dataProvider = dataProvider;
}
@Override
public <T> DataProvider<T> getDataProvider(final String query, final RowMapper<T> rowMapper) {
return this.dataProvider;
}
}
バインディングは
final class QueryTestResourceConfig extends ResourceConfig {
public QueryTestResourceConfig() {
...
this.register(new AbstractBinder() {
@Override
protected void configure() {
bind(DataProviderFactoryStub.class).to(DataProviderFactory.class);
}
});
}
}
このクラスを に正常に挿入できますが、使用される型情報がファクトリに渡されるインスタンスによって共有されないMyStreamingOutput
ため、コンパイラの警告が表示されます。インターフェイスを実装しなくなるためgetDataProvider()
、クラスに型情報を追加できません。間違っているため、インターフェイスの型情報は必要ありません。スタブの場合を除き、ファクトリはインスタンスによって返される型を気にする必要はありません。この場合、設計が悪いと考えているため、パラメータとパラメータにセッターを使用することは避けたいと思います。DataProviderFactoryStub
DataProviderFactory
DataProvider
query
rowMapper
ジェネリックスのアプリケーションに微妙な何かが欠けているか、依存性注入のアプリケーションに明らかな何かが欠けているという感覚を揺るがすことはできません。このユースケースに対処する正しい方法は何ですか? これは DI が対処しようとしている問題のようなものですが、修正方法がわかりません。