3

次の図に示すオブジェクト グラフをどのように作成しますか?

ユーザー オブジェクトは、2 つのデータベース バックエンドからの情報を結合する必要があります。

同じオブジェクト グラフの複数の構成

4

3 に答える 3

3

プライベート モジュールを使用して解決策を見つけました。

static class Service {
    @Inject Dao daoA;

    public void doSomething() {
        daoA.doA();
    }
}

static class Dao {
    @Inject DataSource dataSource;

    public void doA() {
        dataSource.execute();
    }
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface Connection {}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface X {}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface Y {}

static class DataSource {
    @Connection @Inject String connection;

    public void execute() {
        System.out.println("execute on: " + connection);
    }
}

static class XServiceModule extends PrivateModule {
    @Override
    protected void configure() {
        bind(Service.class).annotatedWith(X.class).to(Service.class);
        expose(Service.class).annotatedWith(X.class);

        bindConstant().annotatedWith(Connection.class).to("http://server1");
    }
}

static class YServiceModule extends PrivateModule {
    @Override
    protected void configure() {
        bind(Service.class).annotatedWith(Y.class).to(Service.class);
        expose(Service.class).annotatedWith(Y.class);

        bindConstant().annotatedWith(Connection.class).to("http://server2");
    }
}

public static void main(String[] args) {
    Injector injector = Guice.createInjector(new XServiceModule(), new YServiceModule()); 

    Service serviceX = injector.getInstance(Key.get(Service.class, X.class));  
    serviceX.doSomething(); 

    Service serviceY = injector.getInstance(Key.get(Service.class, Y.class));
    serviceY.doSomething(); 
}
  • Service クラスのさまざまなインスタンスは、X および Y アノテーションによって識別できます。
  • プライベート モジュール内の他のすべての依存関係を非表示にすることで、Dao と DataSource の間に衝突がなくなります。
  • 2 つのプライベート モジュールでは、2 つの異なる方法で定数をバインドできます。
  • サービスは公開を通じて公開されます。
于 2012-05-14T09:02:45.673 に答える
0

これには、BindingAnnotations または単に一般的な @Named Annotation を使用できます。@Provides-Methods で使用するのが最も簡単だと思います。

@Provides
@Named("User1")
public SomeUser getUser(Service1 service) {
   return service.getUser();
}
@Provides
@Named("User2")
public SomeUser getUser(Service2 service) {
   return service.getUser();
}

その後:

@Inject
@Named("User1")
private SomeUser someuser;
...
于 2012-05-14T06:09:09.923 に答える
0

Guice への支援型インジェクション拡張機能を使用して、から を取得するファクトリを生成Serviceし、DataSourceそのファクトリを 2 つの異なる に適用する必要がありますService

于 2012-05-13T17:42:07.680 に答える