3

A と B の 2 つのクラスがあり、B は A に依存しているとします。

public class A {}

public class B {
    public B(A a) {}
}

単一の PicoContainer で B を解決するのは簡単です。

    final MutablePicoContainer root = new PicoBuilder().build();
    root.addComponent(new A());
    root.addComponent(B.class, B.class);
    System.out.println(root.getComponent(B.class));

しかしB、の変数インスタンスを使用して、セッションごとに の異なるインスタンスが必要ですA。このようなことを考えています。

    // during startup
    final MutablePicoContainer root = new PicoBuilder().build();
    root.addComponent(B.class, B.class);

    // later, initialize sessions
    final MutablePicoContainer session = new PicoBuilder(root)
        .implementedBy(TransientPicoContainer.class)
        .build();
    session.addComponent(new A());

    // some request
    System.out.println(session.getComponent(B.class));

上記のコードは、 を要求するときに親コンテナーに要求するsessionため、機能しません。 はそこにありますが、とその親内でのみ解決され、BrootBrootUnsatisfiableDependenciesException.

これを機能させる良い方法はありますか?それとも、これはアンチパターンであり、間違った方法で問題を解決していますか?

4

3 に答える 3

1

コンテナーでキャッシュを有効にしましたか (または Pico 1.x を使用していますか)?

この問題を解決するには、キャッシュを無効にするだけで十分かもしれませ

于 2009-06-05T11:15:01.167 に答える
1

存在しないパフォーマンスの問題を解決することは、良い方法ではありません。問題を確認するためにプロファイリングを行いましたか?

そうでない場合は、最初にそれを行うことを検討してください。

于 2009-05-14T12:50:22.107 に答える
0

B もセッション コンテナー内に登録します。B のその他の依存関係は、ルート コンテナーに残すことができます。B が C に別の依存関係を持っていると仮定します。したがって、次のことができます。

// during startup
final MutablePicoContainer root = new PicoBuilder().build();
root.addComponent(C.class, C.class);

// later, initialize sessions
final MutablePicoContainer session = new PicoBuilder(root)
    .implementedBy(TransientPicoContainer.class)
    .build();
session.addComponent(B.class, B.class);
session.addComponent(new A());

// some request
System.out.println(session.getComponent(B.class));
于 2009-06-04T08:35:35.707 に答える