Ich habe viele Bücher über Softwaredesign gelesen, und ich frage mich immer mehr, ob das, was ich über die Trennung von Geschäftsobjekt und Serialisierung gelernt habe, mich produktiver macht.
Ich bin vom Domain Driven Design beeinflusst, daher denke ich bei der Entwicklung meiner Business-Klassen nicht an Persistenz. Die einzigen Objekte, die mit meiner Datenbank/Web-Service-Technologie/Caching-Technologie gekoppelt sind, sind hinter einem Repository mit einer schönen Domänenschnittstelle gekapselt.
Zur Veranschaulichung: Für eine herkömmliche Anwendung Datenbank<->Webdienst<->RIA entwerfe ich meine Geschäftsklassen Konto und Mitarbeiter. Wenn ich dann Konten aus einer Datenquelle abrufen möchte, erstelle ich ein IAccountRepository und implementiere Methoden zur Abfrage oder zum Hinzufügen von Konten zu meiner Datenquelle.
Um meiner Anwendung Caching-Fähigkeit hinzuzufügen, muss ich nur eine Proxy-Klasse erstellen, die IAccountRepository implementiert und das echte Repository umhüllt, und sie dann in meinen IOC-Container einfügen.
Um ein Datenbank-Repository zu implementieren, verwende ich ein ORM, das Klassen aus meinem Datenbankschema erstellt, dann verwende ich einen Übersetzer, um Datenbankklassen in/aus Geschäftsklassen umzuwandeln, auf diese Weise sind meine Geschäftsklassen von meinem Datenbankschema entkoppelt.
Ich erstelle auch dedizierte Datenvertragsklassen für meine Webdienste, und dann verwenden die Webdienste Übersetzer, um eine Aggregation von Geschäftsobjekten in ihre Datendarstellung aus der Webdienstperspektive zu transformieren.
Wenn ich meine RIA-Anwendung erstelle, entwerfe ich wieder ein eigenes Domänenmodell, aber dieses Mal verwendet die Repository-Implementierung einen Webservice anstelle der Datenbank (und wieder Übersetzer).
Für WPF-Entwickler erstelle ich dann mein ViewModel und meine View.
Früher habe ich so programmiert.
ABER, wenn mein Chef kommt und sagt: Können Sie diesem Formular ein Feld hinzufügen, um... blah blah blah Ich muss:
- Meine Datenbank aktualisieren
- Meine Datenbank aktualisieren Übersetzer
- Mein Geschäftsobjekt aktualisieren
- Aktualisieren Sie meinen Webdienst-Übersetzer (Server)
- Meinen Webdienst-Übersetzer aktualisieren (Client)
- Mein Geschäftsobjekt aktualisieren (Mandant)
- Meine Ansicht aktualisieren
- Für WPF-Kenner: Aktualisieren Sie mein ViewModel
Ich denke mehr und mehr darüber nach, mein Geschäftsobjekt mit Datenbankzugriffstechnologie und Webservice-Technologie oder Serialisierungstechnologie zu verbinden.
Auf diese Weise brauche ich meine Übersetzer nicht mehr zu pflegen. Warum zum Beispiel keine Attribute/Anmerkungen dieser Technologien für die Geschäftsobjekte verwenden? Ja, es bringt einige Einschränkungen mit sich, ja, ich brauche ein get/set für meine Felder, auch wenn ich möchte, dass meine Eigenschaft schreibgeschützt ist, ja, mein Geschäftsmodul wird externe Abhängigkeiten haben. Aber ich denke, es wird zu weniger Code und einem wartungsfreundlicheren System führen.
Die Implementierung meiner Repositories wird trivial sein und sich nicht auf Übersetzer stützen.
Obwohl ich die Vorteile dieser Vorgehensweise sehe, habe ich immer ein schlechtes Gewissen, wenn ich auf diese Weise kodiere. Ich fühle mich wirklich schuldig, wenn ich 5 Attribute/Anmerkungen in Verbindung mit meiner Datenzugriffstechnologie/Webdiensttechnologie/Serialisierungstechnologie zu meinen Geschäftsobjekten hinzufüge, und ich habe das Gefühl, dass es nicht richtig ist.
Warum führt die Trennung der Bereiche Datenbank/Geschäftsobjekte/Webdienst dazu, dass ich mehr Code schreibe?
Haben Sie einige Alternativen?