自动将多个接口绑定到Guice中的一个impl

时间:2011-11-08 03:07:24

标签: java guice

我有一个如下所示的设计,一个接口扩展多个父接口,以及该接口的一个实现。

Class diagram

在我的客户端类中,我想只依赖于一个或多个父接口,而不是ZooKeeperClient。我觉得这是一个更好的设计,因为它减少了我的客户端类依赖项的表面区域,并且它还使得在测试中模拟事物变得更容易。

e.g。

@Inject
public Foo(ServiceUpdater su) {
    // ...
}

但是,为了实现这一点,我需要手动将每个接口的绑定添加到实现类:

bind(ServiceCreator.class).to(ZooKeeperClientImpl.class)
bind(ServiceDeleter.class).to(ZooKeeperClientImpl.class)
bind(ServiceUpdater.class).to(ZooKeeperClientImpl.class)
// ...
bind(ZooKeeperClient.class).to(ZooKeeperClientImpl.class)

有什么方法可以避免这种重复,并告诉Guice立刻绑定整个层次结构?有点像...

bind(ZooKeeperClient.class/* and its parents*/).to(ZooKeeperClient.class)

如果没有,我的设计有问题吗?我在做一些非Guicy的事情吗?

2 个答案:

答案 0 :(得分:2)

在Guice中没有这样的方法,你可以使用像ClassUtils.getAllInterfaces()这样的实用程序迭代所有接口并绑定它们。

答案 1 :(得分:1)

Silk中,您可以对实施类型执行autobind

autobind(ZooKeeperClientImpl.class).toConstructor();

这会将类绑定到它的所有接口和超类(Object除外)。这些绑定显式绑定 - 所以将ZooKeeperClientImpl超级类型之一绑定到其他

bind(ServiceUpdater.class).to(AnotherImplementation.class);

支配 autobind ,这样就不会因为不明确的绑定而产生冲突。

Silk非常像Guice,所以如果你不需要很多Guice代码,那么改变就很容易和快速。