【发布时间】:2015-03-26 07:39:32
【问题描述】:
我只能用例子来解释这个。
我们有主类AppServer。它还包含几个应用程序范围的组件。
AppServer app = new AppServer(config, ...);
现在我们需要提供一个供应商来充当一些Foo 实例的工厂。该供应商将在循环中被多次调用以创建一定数量的Foo 实例。通过使用供应商,我们允许用户提供自己的Foo 实现。请注意,Foo 不是我们的课程,我们无法更改它。
唯一的问题是Foo 需要应用程序中的一些组件。它们需要注入/提供给FooImpl。
可以这样写:
app.setFooSupplier(() -> new FooImpl(app.component()));
这对我来说有点难看,想知道是否有更好的方法来做到这一点?到目前为止,这里有一些想法......
(1) 使用供应商后注入依赖(IoC方式)。
依赖项是使用 setter 定义的。所以我们在 sudo 中有类似(AppServer 内部)的内容:
Foo foo = fooSupplier.get();
maybeInject(foo, component1);
maybeInject(foo, component2);
...
注入什么组件取决于setter是否存在。或者,我们可以使用Component1Aware 接口并执行相同的操作:
Foo foo = fooSupplier.get();
if (foo instanceof Component1Aware) {
((Component1Aware)foo).setComponent1(component1);
}
...
基本上是一样的。
我想在构造函数中有依赖,所以需要设置它们来表达。
(2)使用可选的消费者
为FooImpl 创建一个Supplier 实例,该实例与AppServer 在同一时间Consumer。比如:
public class FooImplSupplier implements Supplier<Foo>, Consumer<AppServer> {
...
}
然后我们可以很容易地注册这个供应商:
app.setFooSupplier(new FooImplSupplier());
在供应商创建实例后(AppServer),我们执行以下操作:
Foo foo = fooSupplier.get();
if (foo instanceof Consumer) {
((Consumer)foo).accept(this);
}
Wdyt?
【问题讨论】:
-
看起来您正在尝试实现自己的依赖注入框架。为什么不使用已建立的依赖注入框架之一,例如 Spring 或 Google Guice?
-
@Jesper 我不会使用框架来替换一个衬里。恕我直言,这太过分了。
-
即使我使用像Petite 这样的最小ioc,也将是一个极端的矫枉过正。只需要连接几个组件,仅此而已。
标签: java functional-programming java-8