Nur versuchen, Gedanken zu sammeln, was funktioniert/nicht funktioniert für die Manipulation von Business/Domain-Objekte über eine ASP.NET (2.0+) UI/Präsentationsebene. Insbesondere in klassischen ASP.NET LOB-Anwendungssituationen, in denen der ASP.NET-Code direkt mit der Business-Schicht kommuniziert. Ich stoße sehr oft auf diese Art von Entwurf und frage mich, was die ideale Lösung ist (d. H. Ein spezifisches Muster implementieren) und was die beste pragmatische Lösung ist, die kein vollständiges Neuschreiben erfordert, wo kein "Muster" implementiert ist.Business/Domain-Objekt in ASP.NET
Hier ist ein Beispielszenario.
Eine einzelne ASP.NET-Seite, die die Seite "Bearbeiten/Neu" für ein bestimmtes Business/Domain-Objekt ist, verwenden wir "Person" als ein Beispiel. Wir möchten Name und Adresse von dieser Seite aus bearbeiten. Während der Benutzer Änderungen vornimmt oder Daten eingibt, gibt es einige Situationen, in denen das Formular für die Aktualisierung reaktiviert werden sollte. Wenn Sie zum Beispiel ihre Adresse bearbeiten, wählen sie ein "Land". Danach wird ein Dropdown-Menü für Bundesstaat/Region aktiviert und mit relevanten Informationen für das ausgewählte Land aktualisiert. Dies ist im Wesentlichen Geschäftslogik (Einschränkung verfügbarer Auswahlen basierend auf einem abhängigen Feld) und diese Logik wird von der Business-Schicht gehandhabt (denken Sie daran, dies ist nur ein Beispiel, es gibt viele Geschäftssituationen, in denen die Logik während des Post-Back-For komplexer ist) Beispiel Versicherungsindustrie bei der Auswahl bestimmter Dinge diktiert, welche anderen Daten benötigt/benötigt werden).
Idealerweise wird diese Logik nur im Business/Domain-Objekt gespeichert (d. H. Die Logik ist im ASP.NET-Code nicht doppelt vorhanden). Um dies zu erreichen, müsste das Business/Domain-Objekt neu initialisiert werden und sein Zustand basierend auf den aktuellen UI-Werten für jedes Postback festgelegt werden.
Zum Beispiel:
private Person person = null;
protected void Page_Load()
{
person = PersonRepository.Load(Request.QueryString["id"]);
if (Page.IsPostBack)
SetPersonStateFromUI(person);
else
SetUIStateFromPerson(person);
}
protected void CountryDropDownList_OnChange()
{
this.StateRegionDropDownList.Enabled = true;
this.StateRegionDropDownList.Items.Clear();
this.StateRegionDropDownList.DataSource = person.AvailableStateRegions;
this.StateRegionDropDownList.DataBind();
}
Andere Optionen, die ich gesehen habe, sind das Business-Objekt in Session speichern, anstatt sie aus dem Repository (auch bekannt als Datenbank) jedes Mal der Seite geladen werden wieder nach oben zu laden.
Gedanken?
Das würde die Logik duplizieren, nicht wahr? Das heißt, wenn ich ein Land für diesen Objektstatus auswähle, weiß mein Address-Objekt, welche verfügbaren Status/Regionen für das ausgewählte Land verfügbar sind. Vielleicht mit Land/Regionen können wir damit durchkommen, aber was ist mit etwas komplizierteren wie, welche Felder benötigt werden, basierend auf der Auswahl eines anderen Feldes. – Brian
Nicht wirklich, die Logik würde nur die UI-Schicht existieren. Während Sie wahrscheinlich die Eingabe in der BL-Schicht verifizieren werden (vorausgesetzt, Sie haben eine Schnittstelle mit Ihrer Benutzeroberfläche, dh sie sind nicht Teil derselben monolithischen App), aber Sie würden die Status-/Regionskaskade in den Geschäftsobjekten nicht implementieren passt einfach nicht. Für mich erledigt die BL-Schicht Dinge, die mit maschinengenerierten oder Benutzereingaben aufgerufen werden können, sie ist nicht an eine Benutzerschnittstelle gebunden. Ich gebe zu, das ist eine Meinung und ich könnte mich irren :) – Lazarus