2011-11-08 2 views
3

У меня есть дизайн, как показано ниже, с одним интерфейсом, расширяющим несколько родительских интерфейсов, и одной реализацией этого интерфейса.Автоматическое связывание нескольких интерфейсов с одним из них в Guice

Class diagram

В моих клиентских классах я хочу зависеть только от одного или нескольких родительских интерфейсов, а не ZooKeeperClient. Я чувствую, что это лучший дизайн, поскольку он уменьшает площадь поверхности зависимостей моего клиентского класса, а также облегчает издевательство над вещами в тестах.

например.

@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

В Guice такого способа нет, вы можете использовать утилиту вроде ClassUtils.getAllInterfaces(), чтобы перебирать все интерфейсы и связывать их.

+0

Спасибо за подтверждение и ссылку. –

1

В Silk вы можете сделать autobind по типу реализации.

autobind(ZooKeeperClientImpl.class).toConstructor(); 

Это будет связывать класс для всех его интерфейсов и супер классов (кроме Object). Эти связывает являются слабее, чемявные связывает - так связывание одного из ZooKeeperClientImpl супер типов к чему-то еще

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

бы властвуйautobind сделано так, что вы не получаете конфликты из-за неоднозначного связывает.

Шелк очень похож на Guice, поэтому, если вам не нужно много кода Guice, это легко и быстро изменить.

+0

Никогда не слышал о Шелке раньше. Попробует попробовать мой следующий проект. Благодаря! –

Смежные вопросы