2009-12-22 8 views
6

Ich bin verwirrt zwischen Domänen-/Anwendungslogik und Benutzerschnittstellenlogik. Um zu illustrieren, was ich versuche festzunageln, werde ich ein imaginäres Programm zur Veranschaulichung unten beschreiben:Verwirrung zwischen Ansichtslogik und Domänenlogik in einer ASP.NET MVC-Webanwendung

(1) Stellen Sie sich eine kleine Anwendung mit einem Satz von 3 kaskadierenden Dropdowns vor. Wenn Sie ein Dropdown-Menü auswählen, wird ein jQuery Ajax GET ausgelöst, das auf einen MVC-Controller trifft und den ausgewählten Wert des zuvor ausgewählten Dropdown-Menüs liefert. Der Controller gibt die zulässigen Optionen für das nächste Dropdownfeld zurück. Das javascript (in der Ansicht) ordnet diese Ergebnisse in einem Drop-down-Menü an. und so weiter. Jedes Mal, wenn Sie ein Dropdown auswählen, wird das nächste aufgefüllt.

(2) Werfen Sie jetzt einen Schraubenschlüssel .. Es gibt einige Ausnahmen. Nehmen wir an, wenn der Benutzer "FOO" oder "BAR" im ersten Dropdown-Menü auswählt, ändert sich das Verhalten, so dass das zweite Dropdown deaktiviert ist, und das Dropdrop-Fenster zeigt stattdessen eine Texbox.

Meine Fragen sind, im Kontext von MVC, der geeignete Ort für diese "Entscheidungslogik"? Wie der Code, der für diese Entscheidungen verantwortlich ist, wie ich in (2) erklärt habe. Der bequemste Ort, an dem ich das gemacht habe, war direkt im Javascript der Aussicht. Ich schrieb einfach Javascript, um zu testen, ob die erste Box "FOO" oder "BAR" ist, dann deaktiviere das zweite Drop-Down und tausche das dritte Drop-Down für ein Textfeld aus. Aber das fühlt sich für mich nicht richtig an. Weil es so aussieht, als sollte es Geschäftslogik sein, deshalb sollte der Code irgendwo in eine Domain-Ebene gehören. Aber das fühlt sich auch nicht richtig an.

Und so fühle ich mich wie ich im Kreis gehe. Kann jemand dieses kleine Design beleuchten?

+0

Gott, wie diese Frage mich in meiner Ausfallzeit plagt. – Merritt

Antwort

2

Ohne Spaltung zu viele Haare oder sich zu fanatisch auf , was das Muster rein ZU HALTEN MUSS GETAN ...

Offensichtlich ist die Steuerung weiß, dass diese Änderung muss auftreten, da beide Fälle behandelt werden (Dropdown-Auswahl oder Texteingabe). Also Logik in Bezug auf diese in der Controller setzen ist keine Sünde.

Es ist ebenso offensichtlich, dass die Ansicht ändern muss, wie es in Abhängigkeit vom Inhalt des ersten Dropdown-Menüs angezeigt wird. Während diese Mischung von Verhaltensweisen nicht gerade die beste UI-Erfahrung ist, die ich mir vorstellen kann, wenn Anforderungen erforderlich sind, muss die Logik dafür in gewissem Maße in der Benutzeroberfläche vorhanden sein. Aber, meine Güte, das ist eine Website wir reden hier über. Wollen Sie wirklich alle Logik aus Javascript entfernen und in eine Controller-Methode verschieben? Die Ansicht entscheidet darüber, wie Daten angezeigt werden, was ihre Aufgabe ist, und so kann keine Sünde sein.

Der wirkliche Weg, um zu vermeiden, auf dem Scheiterhaufen verbrannt zu werden, ist ein Redesign, um die Kontroverse in erster Linie zu vermeiden. Oder, codiere es einfach und meckere über deine lausigen Designanforderungen bei einem Bier.

1

In dieser Situation, in der Sie sehr spezielle Aktionen ausführen müssen, müssen Sie es in die Logik in der js setzen, wie Sie es in Ihrem Dropdown-Beispiel getan haben. Sie sollten die Validierung auch immer auf der Serverseite vornehmen, um sicherzustellen, dass Ihre Daten sauber sind.

Mit den MVC 2 Zeug herauskommen sie haben einige wirklich große Validierung Server/Client-Seite Validierung läuft. Schauen Sie sich Scott Gu Beitrag mehr Einblick dazu: MVC 2 Blog Post

7

Beginnen wir mit dem Domänenmodell.Ein Domain Model ist eine API, die die Domain technologieneutral modelliert. Es kennt keine View-Technologien wie JQuery, HTML oder XAML oder Windows Forms.

Das Domänenmodell enthält Klassen und Schnittstellen, die die Domäne beschreiben und die Domänenkonzepte auf vielfältige und aussagekräftige Weise modellieren können - unabhängig davon, welche Art von Anwendung Sie entwickeln.

In diesem Sinne ist es ziemlich einfach zu sehen, dass die von Ihnen beschriebene Anzeigelogik nicht in das Domänenmodell gehört. Es muss daher in eine UI-spezifische Schicht gehören.

Sie können dies in einem separaten UI Logic Modul oder zusammen mit Ihrer UI-Anwendung - in Ihrem Fall eine ASP.NET MVC-Anwendung. Ob Sie die gewünschte UI-Logik in JavaScript oder serverseitig ausdrücken, ist weniger wichtig.

Persönlich würde ich diese Logik serverseitig in Teilansichten definieren, aber das liegt daran, dass mir die Testbarkeit sehr wichtig ist, und ich weiß, wie ich dieses Verhalten testen würde (es wurde mir gesagt, dass es möglich ist, JQuery zu testen) Code auch, aber ich habe keine Ahnung, ob das stimmt oder nicht).

Wenn Sie jemals eine andere Anwendung schreiben, die auf demselben Domänenmodell basiert, ist es sehr wahrscheinlich, dass sich die Anzeigelogik als sehr unterschiedlich erweist, da verschiedene Technologien unterschiedliche Paradigmen implizieren.

0

Angesichts Ihres Beispiels würde ich diese Logik in der Steuerung nicht stören, es gehört definitiv nicht in das Domänenmodell. Ich würde persönlich besser fühlen die Ajax GET-Anfrage in der Steuerung und entscheiden, was von dort mit JSON auszugeben, anstatt all diese Logik in jQuery (ich fühle mich wohler in C# dann in Javascript). Nachdem ich das gesagt habe, möchte ich meine Aktionsmethoden dünn halten. Was ich also tun würde, ist die involvierte Logik herauszufinden, was die Drop-Downs in einer Methode auf dem Conroller bevölkern und mit [NonAction] dekorieren soll.