2014-11-14 3 views
1

Я надеюсь, что вы все хорошо кодируете. Итак ... Я пересматривал клиентскую сторону приложения GWT, над которым я работаю, и мне было интересно о чем-то. Послезавтра после дня ответа, я решил спросить вас о вашей точке зрения ...Переключение GWT.create (XXX.class) Пользовательской аннотации

Название вполне понятно, но есть фрагмент того, что я хотел бы сделать.

Я хотел бы изменить вещи, как этот

public AnnotatedObject annotated = GWT.create(AnnotatedObject.class); 

что-то вроде этого

@CreativeAnnotation 
public AnnotatedObject; 

я должен был сказать, что в моем xxx.gwt.xml, я сделал что-то вроде этого :

<replace-with class="package.AnnotationObject2"> 
    <when-type-is class="package.AnnotationObject" /> 
</replace-with> 

Как вы можете видеть, мой deffered класс замены AnnotationObject2, и на данный момент, я добавляю линию между о указанные в другом месте выше, и у меня есть:

<replace-with class="package.AnnotationObject1"> 
    <when-type-is class="package.AnnotationObject" /> 
    <when-property-is name="type" value="object1" /> 
</replace-with> 

<replace-with class="package.AnnotationObject2"> 
    <when-type-is class="package.AnnotationObject" /> 
    <when-property-is name="type" value="object2" /> 
</replace-with> 

Я не очень люблю играть с метаданными моего xxx.html, так что результат я хотел бы это одна:

@CreativeAnnotation(type = "object2") 
public AnnotatedObject; 

Таким образом, сделать вы думаете, что возможно с GWT (я должен сказать, что я работаю с GWT 2.5, из-за моих желаний клиента)? Если да, можете ли вы мне помочь?

Заранее спасибо.

EDIT: Я имею в виду, я знаю о GIN ... Просто интересно, как это сделать с нуля.

ответ

4

Вы можете достичь этого, используя инъекцию зависимостей с GIN. GIN автоматически использует GWT.create() для создания объекта, который должен быть введен. Ex:

class MyView { 
    interface MyUiBinder extends UiBinder<Widget, MyView> { 
    } 

    @Inject 
    MyView(MyUiBinder uiBinder) { 
     initWidget(uiBinder.createAndBindUi(this)); 
    } 
} 

И с введением зависимостей, вы также указать, реализация вашего интерфейса для создания экземпляра в вашем GIN модуле:

public class MyModule extends AbstractGinModule { 
protected void configure() { 
    bind(AnnotationObject.class).annotatedWith(Names.named("object1").to(AnnotationObject1.class); 
    bind(AnnotationObject.class).annotatedWith(Names.named("object2").to(AnnotationObject2.class); 
} 
} 

И тогда в вашем коде:

public class MyClass { 

    @Inject 
    public MyClass(@Named("object1") AnnotationObject annotationObject) { 
    ... 
    } 
} 

Вы также можете использовать собственную аннотацию привязки вместо аннотации Named.

+0

+1, так как я собирался дать аналогичный (возможно, менее подробный) ответ! Джин - это точно решение данной проблемы. Мы используем его в нашем приложении GWT и почти никогда не используем GWT.create() ... – PhiLho

+0

Спасибо Julien за ваши ответы. Фактически, я применял ваши лучшие практики, и раньше я использовал GIN. Просто интересно, можно ли быстро написать GIN-подобное. Но на самом деле ваше предложение - лучшее, что нужно сделать, и больше, когда это контекст «компания-сделай-быстро-или-мы-найдем-кого-то-еще». К счастью, это не так, и это было только для моих личных амбиций. –

1

Вы можете написать свой собственный генератор, если вы не хотите использовать GIN - для чего-то подобного это было бы довольно тривиально.

+0

Сделал это! Теперь у меня есть что-то классное! –

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