gpt4 book ai didi

java - 我怎样才能使非辅助依赖成为辅助依赖?

转载 作者:搜寻专家 更新时间:2023-10-30 23:02:39 24 4
gpt4 key购买 nike

假设我有一个第三方类如下:

public class MyObject {
@Inject
public MyObject(Foo foo, Bar bar) { ... }
}

现在假设我有一个像这样的工厂接口(interface):

public interface MyObjectFactory {
public MyObject build(Bar bar);
}

我的想法是,我希望有一个 MyObjectFactory 为固定的 Foo 构建一个 MyObject - 也就是说,基本上添加@Assisted来自外部的 Bar 构造函数参数上的注释。当然,手动实现 MyObjectFactory 总是可行的:

public class MyObjectFactoryImpl implements MyObjectFactory {
@Inject private Provider<Foo> foo;

@Override
public MyObject build(Bar bar) { return new MyObject(foo.get(), bar); }
}

但是假设有一些条件要求我让 Guice 构建 MyObject 实例 - 例如,方法拦截器。这看起来像是“注入(inject)注入(inject)器”的工作:

public class MyObjectFactoryImpl implements MyObjectFactory {
@Inject private Injector injector;

@Override
public MyObject build(Bar bar) {
Injector child = injector.createChildInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Bar.class).toInstance(bar);
// Set up method interceptors for MyObject here...
}
});
return child.getInstance(MyObject.class);
}
}

这听起来很邪恶,而且是样板式的,所以我想知道是否有任何替代实现和/或让 Guice 生成工厂实现的方法。

最佳答案

首先,由于您描述的原因,您很少希望在您的类中传递 MyObject 的实例。你无法控制它们,所以你不能添加 @Assisted 注释,你不能添加方法拦截器等等。另外,当你想换出第三方库时会发生什么对于不同的实现?

因此,您应该将 MyObject 包装到另一个对象中。

// **Please** choose better names than this in your real code.
public class MyWrapperBackedByMyObject implements MyWrapperInterface {
private final MyObject delegate;

@Inject
MyWrapperObject(Foo foo, @Assisted Bar bar) {
delegate = new MyObject(foo, bar);
}

@NotOnWeekends // Example of how you might do method interception
public void orderPizza() {
delegate.orderPizza();
}
}

然后,使用我上面描述的命名约定,删除整个代码中对 MyObject 的所有引用,应该只引用 MyWrapperInterface

关于java - 我怎样才能使非辅助依赖成为辅助依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31064498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com