3

假设我有两个班级 A 和 B,其中 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));

上面的代码不起作用,因为当请求sessiona时,B它会向父容器root请求它。 B在那里找到,但只在内部root和它的父母中解决,导致UnsatisfiableDependenciesException.

有什么好的方法可以使这项工作吗?或者这是一种反模式,我以错误的方式解决问题?

4

3 回答 3

1

解决不存在的性能问题不是一个好方法。您是否进行了任何分析来验证问题?

如果没有,请考虑先这样做。

于 2009-05-14T12:50:22.107 回答
1

您是否在容器上启用了缓存(或者您使用的是 Pico 1.x)?

尝试阅读这个,也许禁用缓存足以解决这个问题。

于 2009-06-05T11:15:01.167 回答
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 回答