Отложенное связывание / GIN в виджетах / библиотеках GWT - PullRequest
1 голос
/ 15 февраля 2011

Я немного борюсь с концепцией отложенного связывания и / или внедрения зависимости в библиотеки / виджеты.Я пытаюсь найти лучший подход для решения следующей проблемы: я хочу реализовать виджет визуализации (составной), который принимает некоторые данные и отображает их.

Я хочу отделить способ извлечения данных от фактической части визуализации.Поэтому я добавил универсальный интерфейс «DataSource», который выглядит следующим образом:

public interface DataSource {
    public void fetch(int start, int end, boolean getFeatures, 
                         DataSourceCallback callback);  
}

, и я добавляю установщик в свой виджет:

public void setDataSource(DataSource source) { this.source = source}

В целях поддержки http как источники данных, я такжедобавлен абстрактный класс, который реализует интерфейс DataSource и принимает URL в своем конструкторе по умолчанию:

public abstract class HttpDataSource implements DataSource {
        protected String url;

        public HttpDataSource(String url) {
               this.url = url;
        }
}

Мой специальный DataSouce расширяет этот абстрактный класс и реализует метод выборки интерфейса:

public class MyDataSource extends HttpDataSource {

      public MyDataSource(String url) {
             super(url);
      }
}

Это хорошо работает.Я могу создать экземпляр класса MyDataSource и передать его установщику моего виджета.Теперь я хочу сделать виджет несколько настраиваемым.Я знаю, что это можно сделать с помощью инъекции зависимостей или отложенных привязок.

Таким образом, один из подходов - позволить пользователю виджета установить источник данных в XML-файле модуля (аналогично тому, как это делается в библиотеке gwt-log: http://code.google.com/p/gwt-log/source/browse/trunk/Log/src/com/allen_sauer/gwt/log/gwt-log-impl.gwt.xml)

<replace-with class="MyDataSource">
    <when-type-is class="DataSource" />
    <when-property-is name="source" value="MyDataSourceName" />
  </replace-with>

Однако я не знаю, возможно ли это, потому что, передав URL-адрес в конструктор MyDataSource, у меня есть состояние, и я не уверен, как это работает с отложенным связыванием.URL-адрес также настроен в XML-файле модуля?

Меня также беспокоит, могут ли люди, использующие этот виджет / библиотеку, реализовать свой собственный DataSource и передать его виджету (не мешает ли это отложенному связыванию).?)

Я полагаю, что другое решение будет использовать внедрение зависимостей в родительском приложении, которое использует виджет / библиотеку визуализации (как можно передать URL-адрес и т. Д. Я, вероятно, должен ввести Factory?)

Какое из этих двух решений лучше, и в целом имеет ли смысл использовать отложенное связывание или GIN для решения этой проблемыlem?

заранее спасибо

Uemit

1 Ответ

2 голосов
/ 15 февраля 2011

Вы должны использовать GIN, а не отложенное связывание. Отложенное связывание - это «метод, используемый компилятором GWT для создания и выбора конкретной реализации класса на основе набора параметров. По сути, отложенное связывание является ответом Google Web Toolkit для отражения Java». (из Основы кодирования ) В вашем сценарии вы не пытаетесь предоставить реализацию, основанную на наборе параметров во время компиляции, а скорее во время выполнения.

Вы можете использовать GIN здесь несколькими способами. Я бы предложил, чтобы ваш Widget через свой конструктор брал экземпляр DataSource. Смотрите GinTutorial о том, как это сделать. Это объясняет это гораздо лучше, чем я в нескольких параграфах.

...