2016-08-22 3 views
0

снова небольшая проблема, понимая «как работает гобелен».Гобелен: Внедрение во время выполнения

У меня есть компонент Гобелена (в данном случае значения датчик):

public class EditionEncoder implements ValueEncoder<Edition>, ValueEncoderFactory<Edition> { 

    @Inject 
    private IEditionManager editionDao; 

    public EditionEncoder(IEditionManager editionDao) { 
     this.editionManager = editionDao; 
    } 

    @Override 
    public String toClient(Edition value) { 
     if(value == null) { 
      return ""; 
     } 
     return value.getName(); 
    } 

    @Override 
    public Edition toValue(String clientValue) { 
     if(clientValue.equals("")) { 
      return null; 
     } 
     return editionManager.getEditionByName(clientValue); 
    } 

    @Override 
    public ValueEncoder<Edition> create(Class<Edition> type) { 
     return this; 
    } 
} 

подающего менеджер не работает, потому что кодировщик создается в пределах страницы, как, что:

public void create() { 
     editionEncoder = new EditionEncoder(); 
    } 

casued этим, я буду вынужден использовать это уродливое решение:

@Inject 
private IEditionManager editionmanager; 
editionEncoder = new EditionEncoder(editionManager); 

есть ли лучший способ для инъекции компонентов во время работы или для этого есть лучшее решение?

Спасибо за вашу помощь заранее,

ответ

0

Как только вы используете «новый», то гобелен МОК не участвует в создании объектов и не может вводить. Вы должны вводить все и никогда не использовать «новые» для однопользовательских сервисов. Это справедливо для всех контейнеров ioc, а не только для гобеленов-ioc.

Также, если вы помещаете @Inject в поле, вам также не нужен конструктор для его установки. Сделайте то или другое, никогда и то, и другое.

Вы должны сделать что-то вроде этого:

public class MyAppModule { 
    public void bind(ServiceBinder binder) { 
     binder.bind(EditionEncoder.class); 
    } 
} 

Затем на странице/компонент/услуги

@Inject EditionEncoder editionEncoder; 

Если вы хотите поместить свои собственные экземпляры объектов там вы можете сделать

public class MyServiceModule { 
    public void bind(ServiceBinder binder) { 
     binder.bind(Service1.class, Service1Impl.class); 
     binder.bind(Service2.class, Service2Impl.class); 
    } 
    public SomeService buildSomeService(Service1 service1, Service2 service2, @AutoBuild Service3Impl service3) { 
     Date someDate = new Date(); 
     return new SomeServiceImpl(service1, service2, service3, someDate); 
    } 
} 
+0

yip, это понятно для меня. Но, например, весной можно «заставить» механизм впрыска с помощью ручных экземпляров. Я ищу похожий способ., Я не люблю путь с аргументами конструктора. – user3066027

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