Рекомендация: изменение типа введенного кода в зависимости от способа ввода владельца - PullRequest
1 голос
/ 02 августа 2009

У меня есть приложение на основе guice, которому теперь нужно несколько экземпляров данного типа, поэтому я планирую использовать именованную аннотацию для устранения неоднозначности зависимостей. Однако зависимость этого типа также должна меняться в зависимости от того, какую я получаю.

Для иллюстрации скажем, у меня есть

@Singleton
public class FooCache {
    private final FooCacheListener listener;
    @Inject 
    public FooCache(FooCacheListener listener) {
        this.listener = listener;
    }
    // do stuff
}

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

@ThatOne FooCache

в одном классе и

@ThisOne FooCache

в другом.

Теперь давайте предположим, что в каждом случае мне нужен другой слушатель (возможно, один записывает что-то в базу данных, а другой отправляет уведомление через JMS или в какой-то распределенный кеш). Как бы я это сделал? Я не вижу, чтобы я мог вставить имя в FooCacheListener, так как мне нужно другое имя в одной ситуации по сравнению с другой, тогда как у меня есть только одно место. Единственный способ, которым я могу думать об этом, - это создать подклассы FooCache, но это кажется мне очень неуклюжим подходом.

Приветствие Matt

1 Ответ

2 голосов
/ 03 августа 2009

Возможно, вы сможете использовать PrivateModules. Перейдите сюда и прокрутите вниз до Как построить два одинаковых, но немного разных дерева объектов? Это способ иметь два разных экземпляра одного и того же класса, который звучит почти точно ты пытаешься сделать. Вы можете передать свои кешлисты вместо "lefty" и "rightty", переданных в примере. Там больше ссылок с подробностями, если это выглядит так, как вы хотите.

Другим вариантом может быть внедрение фабрики, которая также обсуждается в приведенной выше ссылке в вопросе Как передать параметр при создании объекта через Guice?

...