В моем приложении мне нужно приобрести другую реализацию, зависящую от вводимых пользователем данных.
Поскольку я хочу в полной мере использовать преимущества HK2, я хочу решить эту проблему с помощью методов, предоставляемых Jersey / HK2.
До сих пор все, что я когда-либо делал, это инжектировал сервисы через интерфейсы, которые были привязаны к реализациям при запуске, используя ApplicationConfig
и ApplicationBinder
:
@javax.ws.rs.ApplicationPath("api")
public class ApplicationConfig extends ResourceConfig
{
public ApplicationConfig()
{
super();
packages(true, "my.package");
register(new ApplicationBinder());
register(....);
....
}
}
public class ApplicationBinder extends AbstractBinder
{
@Override
protected void configure()
{
bind(ServletTemplateLoader.class).to(TemplateLoader.class);
bindAsContract(JobsImpl.class);
bindAsContract(JobInputAppender.class);
bindAsContract(ParamNameMapper.class);
bind(RedisJobRepository.class).to(JobRepositoryInterface.class);
....
}
Теперь, однако, мне нужно приобрести реализациюдинамически в зависимости от ввода пользователя.Существует 25 различных реализаций, использующих один и тот же интерфейс.
Это означает, что я больше не могу просто использовать подход bind.to
.Вместо этого я считаю, что мне нужно зарегистрировать их все индивидуально с помощью bindAsContract
.
Но тогда, как мне написать метод / класс, который для любого данного ввода (от пользователя) предоставит мне правильную реализацию?
По сути, мне нужен метод, который выглядит следующим образом:
public interface MyInterface {}
public class Type1Impl implements MyInterface {} // registered with `bindAsContract`
public MyInterface getImplementation(final String type_)
{
switch (type_) {
case "type1":
return // what to do here to get "my.package.Type1Impl" instance?
case "type":
....
}
}
Мне нужно, чтобы экземпляр пришел из HK2, потому что Impl также использует внедренные сервисы, поэтому я не могу просто создатьновый экземпляр на лету.