私の頭にはいくつかのアイデアがあります。いつ、どのように交換したいかによって、 1つの可能性は、構成を使用してモジュールをインスタンス化することです。単純なブール値にすることができます:
@Module
public class RepositoryModule {
private final boolean isDemo;
public RepositoryModule(boolean isDemo) {
this.isDemo = isDemo;
}
@Provides
public Repository providesRepository() {
return isDemo? new DemoRepository() : new RemoteRepository();
}
// Other providers
}
私はこのアプローチのファンではありませんが、ユースケースに合っています。私はそれが非常に限定的であり、容易な保守性を考慮していないと信じています。私はおそらく、工場を使用し、レポ自体の代わりに工場を提供することを選択します。
public interface RepositoryFactory {
Repository getRepository(Configuration configuration);
}
public class RepositoryFactoryImpl implements RepositoryFactory {
@Inject
public RepositoryFactoryImpl() {}
// The implementation
}
@Module
public class RepositoryModule {
@Provides
public RepositoryFactory providesRepositoryFactory(
RepositoryFactoryImpl factory) {
return factory;
}
// Other providers
}
Configuration
あなたのレポを設定するには、いくつかの属性を指定することができ、簡単なPOJOだろう。例えば言う:
public class Configuration {
private final boolean isDemo;
// all the POJO stuff you need
}
あなたは、あなたのドメインオブジェクトは工場に依存することができます:
public class SomeAwesomeBusinessLogic {
private final RepositoryFactory repositoryFactory;
@Inject
public SomeAwesomeBusinessLogic(
RepositoryFactory repositoryFactory) {
this.repositoryFactory = repositoryFactory;
}
//awesome stuff going down
}
あなたは、あなたのビジネスロジックにrepositoryFactory.getRepository(new Configuration(true/false));
を行うことができます。
私は、新しいタイプのreposに拡張する方が簡単なので、この方法をお勧めします。また、ファクトリロジックが正しいかどうかをテストすることもできます。誰も通常、短剣モジュールをテストする人はいません。そのため、私は最初のアプローチに熱心ではありません。
もう1つの良い点は、異なるConfiguration
オブジェクトを工場に提供することによって、アプリケーションの設定を変更してデモレポに突然変更する可能性がある場合に、同じモジュールインスタンスを維持できることです。
3番目の可能性はProducersです。しかし、これは本当にあなたのユースケースと、このランタイム依存関係の交換をどのように処理するかによって異なります。私はこのアプローチがかなり良いと思っていますが、それはちょっと残忍かもしれません。
希望すると便利です。