2009-07-08 12 views
4

Aus einem Artikel Ich habe gerade gelesen,Trennung der Präsentationsschicht von Business-Schicht

UI Layer Abstraction

Nun gibt es irgendwelche Rückschläge zu einer vollständigen Trennung zwischen der Präsentationsschicht und der Business-Schicht?

Diese Frage kam tatsächlich von einem Problem der Verfolgung des Fortschritts eines Prozesses (bestimmte Reihe von Anweisungen) und dem Aktualisieren eines Fortschrittsbalkens entsprechend zum Beispiel.

Jetzt ist der einzige, der den tatsächlichen Fortschritt kennt, der Prozess selbst, und das ist in der Business-Schicht. Wenn also beide Ebenen ziemlich getrennt sind, wie kann ich den Fortschrittsbalken innerhalb der Business-Ebene erreichen, ohne auf die Domain der Darstellungsschicht zu treten? Oder zumindest Fortschrittswerte an die Präsentationsebene zurückgeben?

Antwort

8

IMHO der Dialog über die Trennung von Schichten vermisst einen Schlüssel Tatsache: Während Schichten aus vielen Gründen getrennt werden müssen, bedeutet das nicht, dass sie nicht Dinge tun können, um Dinge für die anderen Schichten zu erleichtern.

Wir hatten eine ähnliche Anforderung - ein Fortschrittsbalken für einen lang andauernden Geschäftsprozess. Was wir getan haben, war das Definieren von Fortschrittsereignissen im Business-Layer-Code. Diese Ereignisse würden zu sehr unterschiedlichen Zeiten aufgerufen - zum Beispiel Prozentsätze - und jemand, der sie abonniert hat. In unserem Fall war es die UI-Ebene!

Also die Schichten sind getrennt, aber "Business" muss verstehen, dass jemand es sehen möchte!

+0

yep das ist, was ich tun werde. Vielen Dank und vielen Dank für euch alle –

1

Lassen Sie die Präsentationsschicht die Business-Schicht nach dem Fortschrittsstatus abfragen.

3

Abhängigkeitsinjektion.

IOW Ihre Präsentationsebene implementiert einige Business-Layer-Callback-Schnittstelle (daher Abhängigkeiten in die gute Richtung: ui-> biz) und registriert zur Laufzeit zur Business-Komponente. In diesem Fall sendet die Business-Komponente Fortschritts-Updates an ihre Callback-Schnittstelle und kümmert sich nicht darum, wer "wem" zuhört.

0

Eine "innere" Schicht kann Code in einer "äußeren" Schicht aufrufen, solange die äußere Schicht angibt, was der Rückrufcode ist. Dies kann je nach Sprache durch Objekte, Interfaces, Delegates oder Funktionszeiger ausgedrückt werden.

void DoSomethingLengthy(string arg1, Action<double> progressCallback) 
{ 
    // during the operation 
    progressCallback(0.5); // halfway 
} 

DoSomethingLengthy("blah", progress => bar.Value = 100 * progress); 
1

Sie sollten die "Fortschrittsbalken" auch als zwei separate Teile der Logik betrachten.

Der Balken, den der Benutzer sieht, ist 100% -Präsentation, und als solche sollte die gesamte Logik, um es wachsen zu lassen, in der Ansicht enthalten sein.

Ihre Business-Schicht könnte ein "ProgressUpdated" -Ereignis offen legen, bei dem einfach alle X-Prozent ausgelöst werden.

Die Ansicht würde das Ereignis abonnieren und auf der Benutzeroberfläche sinnvoll anzeigen.

3

Offensichtlich muss die Business-Schicht wissen, welche Fortschritte gemacht wurden. Es muss dann entweder der Präsentationsschicht mitteilen, wann der Fortschritt erfolgt ist, oder die Präsentationsschicht muss die Business-Schicht fragen. Was auch immer du bevorzugst.

Der entscheidende Punkt ist, dass die Präsentationsschicht nicht beurteilen sollte, welche Fortschritte gemacht wurden, und dass die Geschäftsebene nicht entscheiden muss, wie die Informationen dem Benutzer präsentiert werden sollen.

Grüße

+0

Danke für die unkomplizierte Formulierung! :-) – olli

0

Ein anderer, den ich gefunden habe, ist, dass die Metadaten der Business-Schicht - z.B. Feldlängen und Eindeutigkeit in einer Datenbank - sind Dinge, über die Präsentationsebenen wissen müssen.

Sie können es entweder aus der Business-Schicht oder in einem gemeinsamen Modul, das die beiden teilen, exportieren, aber es ist wichtig, dass Sie nicht dieselben Informationen in der Business-Schicht als Datenbankfeldlängen und in der Präsentation duplizieren Ebene als Eingabebeschränkungen.

Verwandte Themen