In meinem Artikel auf InfoQ habe ich untersucht, wie Grails und Flex kombiniert werden können, um eine Plattform für die schnelle Anwendungsentwicklung zu schaffen. Meiner Meinung nach ist dies derzeit eine der vielversprechendsten Kombinationen für die RIA-Entwicklung. Im Flex-Bereich ist viel los und es gibt viele Initiativen. Vor ein paar Tagen bin ich im Internet auf diese Initiative gestoßen:
Parsley
Dies ist eine IOC-Implementierung, die vom Spring-Framework inspiriert ist. Auf der offiziellen Website wird es mit Cairngorm verglichen. Ohne es überhaupt ausprobiert zu haben, glaube ich, dass es mir schon besser gefällt als Cairngorm. Für mich ist Cairngorm ein Haufen sehr guter Ideen, die kaum implementiert wurden, um sie zu unterstützen. Parsley ist, wie Spring, eher ein Haufen guter Ideen
import org.spicefactory.pimento.config.Operation;
@org.spicefactory.pimento.config.Managed(operations=[Operation.ALL])
class Person {
def String name;
def int Alter;
}
Dies ist eine ganz normale Grails-Domänenklasse, mit der Ausnahme, dass sie eine Annotation hat, die Pimento so konfiguriert, dass Datenmanipulationen an dieser Klasse möglich sind. Diese Klasse wird im clientseitigen Code wie folgt gespiegelt:
Paket
{
[RemoteClass(alias='Person')]
public class Person
{
public var id:Number = 0;
public var version:Number;
public var name:String;
public var age:Number;
}
}
Das Duplizieren dieser Klasse ist immer noch notwendig. Es sollte recht einfach sein, diese Klasse aus Groovy-Code zu erzeugen. Beachten Sie, dass die Felder id und version, die von Grails automatisch hinzugefügt werden, auch in die ActionScript-Klasse kopiert werden. Der Rest der Client-Seite könnte etwa so aussehen:
private function initEntityManager () : void {
var config:PimentoConfig = new PimentoConfig();
config.serviceUrl = getWebContextRoot(application.url) + "service";
trace('url: ' + config.serviceUrl)
config.defaultTimeout = 5000;
config.configure();
entityManager = config.entityManager;
}
private var entityManager:EntityManager;
[Bindbar]
private var people:ArrayCollection;
private function refreshPersons () : void {
var q:Query = entityManager.createQuery("from Person where age between :minAge and :maxAge");
q.setNamedParameter("minAge", uint(ageFilter.values[0]));
q.setNamedParameter("maxAge", uint(ageFilter.values[1]));
q.getResultList().addResultHandler(onRefresh);
}
private function onRefresh (result:Array) : void {
this.people = new ArrayCollection(result);
}
Sehen Sie, wie der Client die Daten direkt aus dem EntityManager lädt! Ebenso kann der Client Daten direkt aktualisieren und löschen. Was halten Sie nun von diesem Ansatz? Auf der PRO-Seite:
- Viel weniger Code schreiben: Keine DAO erforderlich. Keine Serviceschicht, die nur an die DAOs delegiert.
- Keine Probleme mit trägem Laden: Der Client hat die Kontrolle und kann laden, was nötig ist.
- Besseres Verpacken von Funktionen: Der gesamte (oder der meiste) Code, der für eine Funktion erforderlich ist, befindet sich im Client-Code.
- ...
Auf der CON-Seite:
- Sehr grobe Zugriffskontrolle: Operationen können pro Entität erlaubt/verboten werden.
- Datenzugriffscode (obwohl EJBQL) verstreut im (Client-)Code.
- Keine klare Trennung der Anliegen: Sehr datenzentrierte und datengesteuerte Anwendung.
- ...
Haben Sie eine Idee?
Verfasst von
Maarten Winkels
Contact