6

私は Guice の世界から来て、Guice が提供する Modules.override に似た方法を探しています。プロダクション用にベース Module/AbstractBinder を作成し、テストで変更が必要なバインディングをオーバーライドするパターンがあります。

理想的な世界では、単純に Parent AbstractBinder を拡張してから、バインドを実装して親バインダーをオーバーライドしたいと考えています。または、親バインダーをインストールしてから、テスト目的で必要なバインディングをオーバーライドするという別の方法もあります。

public class IOCRestModule extends AbstractBinder {

    @Override
    protected void configure() {
        // Max timeout for rest calls is 20 seconds, this will come from properties later on.
        bind(20000).to(Integer.class).named("MAX_REST_REQUEST_TIMEOUT");
        bind("tcp://localhost").to(String.class).named("jms.url");
    }
}

public class IOCMockRestModule extends AbstractBinder {

    public static final Logger logger = Logger.getLogger(IOCMockRestModule.class.getName());

    @Override
    protected void configure() {
        install(new IOCRestModule());
        bind(200).to(Integer.class).named("MAX_REST_REQUEST_TIMEOUT");
        bind("vm://localhost").to(String.class).named("jms.url");

}

これは可能で、推奨されますか? これを行ったときに、IOCRestModule のバインディングが IOCMockRestModule によってオーバーライドされていないことに気付きました。最後にインストールを追加できると想定していますが、これは機能する可能性がありますが、後で問題が発生するかどうかはわかりません.

4

1 に答える 1

0

hk2 では、同じものに対して複数のバインディングを使用できます。デフォルトでは最も古いものが優先されますが、これはランクを使用して変更できます。したがって、次のコードは順序を変更すると思います。

@Override
protected void configure() {
    install(new IOCRestModule());
    bind(200).to(Integer.class).named("MAX_REST_REQUEST_TIMEOUT").ranked(10);
    bind("vm://localhost").to(String.class).named("jms.url").ranked(10);
}

これにより、基本的に、このバインディングは IOCRestModule からのバインディングよりも高いランクになり、最初にインジェクション ポイントで使用されます。誰かが MAX_REST_REQUEST_TIMEOUT という名前の Integer のリストを探す場合、そのうちの 2 つを取得することに注意してください。

于 2015-02-09T21:00:16.933 に答える