Gibt es eine Notwendigkeit für eine Factory-Klasse zum Erstellen von Ansichtsmodellen?

17

Ein Kollege von mir schlug vor, eine Factory-Klasse zum Erstellen von Ansichtsmodellobjekten in unseren ASP.NET MVC-Lösungen zu verwenden. Die Idee ist, dass es beim Design und der Wartbarkeit der Art und Weise helfen kann, wie Ansichtsmodelle in unseren Apps erstellt werden.

Ich wollte herausfinden, ob jemand Erfahrung damit hat. Ich habe einige Nachforschungen angestellt und sehr wenig über diese Praxis herausgefunden.

Derzeit erstellen wir Viewmodel-Objekte auf Controller-Ebene, z

public ActionResult Index()
{
    return this.View(this.BuildIndexViewModel());
}

Also ist this.BuildIndexViewModel () dafür verantwortlich, die viewmodel-Klasse zu erstellen (offensichtlich :). Aber wir untersuchen die Möglichkeiten von:

public ActionResult Index()
{
    return this.View(ViewModelFactory.CreateIndexViewModel());
}

Das ist eine interessante Idee, aber ich bin nicht zu 100% überzeugt. Ich war an den Meinungen anderer Leute interessiert.

Jason Evans
quelle
4
Ich kämpfe darum, den Nutzen ehrlich zu sehen. Sie würden eine Fabrik benutzen, um die Konstruktion von Objekten zu verbergen, aber warum sollten Sie in diesem Fall?
CodeART
3
Ihre BuildIndexViewModel-Methode ist bereits eine Factory-Methode, die vermutlich für den Controller privat ist. Der einzige Grund, dies zu einer bestimmten Factory-Klasse zu extrahieren, wäre die Wiederverwendung in einem anderen Controller.
MattDavey
Ihr beide teilt die gleichen Gedanken wie ich, also bin ich froh, dass ich nicht allein bin :) @MattDavey Ich kann ehrlich sagen, ich bezweifle sehr, dass die Ansichtsmodelle mit mehr als einem Controller verwendet werden, was die Fabrik ausmacht Idee überflüssig. Ich werde das teilen, wenn das Thema bei der Arbeit wieder auftaucht.
Jason Evans
Ich persönlich würde es vorziehen, wenn der Typ des Ansichtsmodells der Experte für den Prozess des Konstruierens selbst wäre. Das einzige Mal, dass Fachwissen woanders liegen sollte, ist, wenn die Konstruktion Kenntnisse anderer Anwendungsbereiche (z. B. Repositories) erfordert. In diesem Fall möchten Sie möglicherweise, dass ein Mittelsmann das Ansichtsmodell dumm hält :)
MattDavey,
@MattDavey: Kannst du diese beiden Kommentare in eine Antwort einwickeln, die ich positiv bewerten kann?
pdr

Antworten:

8

In diesem Fall würde ich sagen, dass die besten Leitlinien die GRASP- Prinzipien sind. Sehen Sie sich insbesondere die vier Kriterien für die Zuweisung der Objekterstellung an:

Im Allgemeinen sollte eine Klasse B für die Erstellung von Instanzen der Klasse A verantwortlich sein, wenn eine oder vorzugsweise mehrere der folgenden Bedingungen zutreffen

  • Instanzen von B enthalten oder fassen Instanzen von A zusammen
  • Instanzen von B zeichnen Instanzen von A auf
  • Instanzen von B verwenden eng Instanzen von A
  • Instanzen von B verfügen über die Initialisierungsinformationen für Instanzen von A und geben diese bei der Erstellung weiter.

Ihre Controller-Klasse (B) entspricht den Elementen Nr. 3 und Nr. 4 dieser Liste (und Nr. 2, wenn das Ansichtsmodell zurückgeschickt wurde), sodass das Konstruktionsverhalten von Ansichtsmodell (A) bereits an einem sehr vernünftigen Ort zu leben hat. Aus meiner Sicht würde es nur zwei Gründe geben, die mich dazu zwingen würden, dieses Konstruktionsverhalten in eine Fachklasse zu überführen.

  • DRY - Wenn zwei oder mehr Controller das Konstruktionsverhalten des Ansichtsmodells gemeinsam nutzen müssen, erleichtert das Einkapseln in eine separate Komponente die Wiederverwendung von Code und vermeidet Doppelungen.
  • Wenn das Konstruktionsverhalten von anderen Systemkomponenten wie Repositorys, Validatoren usw. abhängt und Sie diese Kopplung nicht in die Steuerung selbst einführen möchten (in GRASP-Begriffen eine reine Fertigung).

Wenn ich auf diese 4 Kriterien zur Objekterstellung in GRASP zurückblicke, würde ich das Verhalten nur in eine separate Factory extrahieren, wenn es mir einen zusätzlichen Haken in dieser Liste einbringt. Andernfalls hätte dies keinen Wert.

Ich hoffe, das hilft!

MattDavey
quelle