Question

J'ai un peu du mal avec le concept de liaison différée et / ou d'injection de dépendance dans les bibliothèques / widgets. J'essaie de trouver la meilleure approche pour suivre le problème: je souhaite implémenter un widget de visualisation (composite) qui prend certaines données et les affiche.

Je souhaite séparer la façon dont les données sont récupérées de la partie de visualisation réelle. J'ai donc ajouté une interface générique "DataSource" qui ressemble à ceci:

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

Et j'ajoute un secteur à mon widget:

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

Dans ODER pour prendre en charge HTTP comme DataSources, j'ai également ajouté une classe abstraite qui implémente l'interface DataSource et prend une URL dans son constructeur par défaut:

public abstract class HttpDataSource implements DataSource {
        protected String url;

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

Ma dataSouce spécifique étend cette classe abstraite et met en œuvre la méthode Fetch de l'interface:

public class MyDataSource extends HttpDataSource {

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

Cela fonctionne bien. Je peux créer une instance de la classe MyDataSource la transmet au passeur de mon widget. Maintenant, je veux rendre le widget quelque peu configurable. Je sais que cela peut être fait par l'injection de dépendance ou les liaisons différées.

Une approche serait donc de permettre à l'utilisateur du widget de définir la source de données dans le fichier XML du module (similaire à la façon dont il se fait dans la bibliothèque 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>

Cependant, je ne sais pas si cela est possible car en passant une URL dans le constructeur de MyDatasource, j'ai un état et je ne sais pas comment cela fonctionne avec la liaison différée. Sur une note latérale: serait-il possible d'avoir l'URL également configuré dans le fichier XML du module?

Je suis également inquiet si les personnes qui utilisent ce widget / bibliothèque peuvent implémenter leur propre source de données et la transmettre au widget (n'interfère-t-elle pas avec la liaison différée?)

Je suppose qu'une autre solution serait d'utiliser l'injection de dépendance dans l'application parent qui utilise le widget / bibliothèque de visualisation (comment passer l'URL, etc. Je dois probablement injecter une usine?)

Laquelle de ces deux solutions est meilleure et en général est-il logique d'utiliser une liaison ou un gin différé pour résoudre ce problème?

Merci d'avance

Uemit

Était-ce utile?

La solution

Vous devez utiliser le gin, pas la liaison différée. La liaison différée est "est une technique utilisée par le compilateur GWT pour créer et sélectionner une implémentation spécifique d'une classe basée sur un ensemble de paramètres. Essentiellement, la liaison différée est la réponse de la boîte à outils Web Google à la réflexion Java." (de Bases de codage) Dans votre scénario, vous n'essayez pas de fournir une implémentation basée sur un ensemble de paramètres au moment de la compilation, mais plutôt du temps d'exécution.

Vous pouvez utiliser le gin ici de plusieurs façons. Je vous suggère de faire prendre votre widget via son constructeur l'instance DataSource. Voir le Gintural sur les moyens de le faire. Il fait un bien meilleur travail pour l'expliquer que je ne peux dans quelques paragraphes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top