Ich stelle einige CRUD-Methoden über den WCF-Dienst für einige Datenobjekte offen, die in einer Datenbank über NHibernate bestehen. Ist es ein guter Ansatz, NHibernate-Klassen als Datenverträge zu verwenden, oder ist es besser, sie in andere Datenverträge zu integrieren oder zu ersetzen? Was ist Ihr Ansatz?
Unser Team hat gerade ein paar Monate damit verbracht, diesen Design-Punkt zu diskutieren, also habe ich eine Menge Links zu teilen; -)
Kurze Antwort: Sie sollten "von" Ihren NHibernate-Klassen in ein Domänenmodell übersetzen.
Lange Antwort: Ich denke, die Antwort darauf ist eine Frage des Prinzips. Wenn Sie jemals interoperabel sein möchten, sollten Sie nicht Datasets als DTOs verwenden ( Ich liebe Hanselmans Beitrag dazu ). Ich sage nicht, dass es nie eine gute Idee ist; eindeutig haben die Menschen Erfolg gehabt. Nur wissen, dass Sie Ecken schneiden und es ist ein riskantes Angebot.
Wenn Sie die Kontrolle über die Klassen haben, in die Sie die Daten übertragen, können Sie ein nettes Domänenmodell erstellen und die NHibernate-Daten in diese Klassen abbilden. Sie werden mehr als wahrscheinlich ernsthafte Probleme dabei haben, wie IList & lt; & gt; (dem ein & lt; bag & gt; zugeordnet ist) ist nicht serialisierbar. Sie müssten Ihren eigenen Serializer schreiben oder etwas wie NetDataContractSerializer , aber Sie verlieren Interoperabilität.
Sie müssen den Arbeitsaufwand messen, der beim Erstellen einiger Wrapper-Klassen und der Übersetzung zwischen den beiden Faktoren erforderlich ist, aber dann haben Sie vollständige Flexibilität bei der Darstellung Ihres Domänenmodells. Dann können Sie Dinge (wie wir es getan haben) wie die Code-Generierung für Ihre NHibernate-Maps und -Objekte tun. Ihre Datenkontrakte dienen dann als Abstraktion Ihrer Daten, so wie sie sollten.
P.S. Vielleicht möchten Sie einen Blick auf ADO.NET Data Services werfen, was eine REST-konforme Methode ist Setzen Sie Ihre Daten frei, die zu diesem Zeitpunkt die interoperabelste Option für die Offenlegung Ihrer Daten zu sein scheinen.
Sie möchten Ihr Domänenmodell nicht direkt verfügbar machen, sondern die Domäne einer Art Nachricht zuordnen, wenn sie die Prozessgrenze erreicht. Sie könnten NHibernate nutzen, um die Mapping-Arbeit für Sie durchzuführen. In diesem Fall hätten Sie zwei Zuordnungen, eine für Ihr Domänenmodell und eine für Ihre leichtgewichtigen Nachrichten.
Ich habe keine direkte Erfahrung damit, aber ich habe bereits Datensätze über WCF gesendet, und das funktioniert gut. Ich denke, Ihr größtes Problem bei der Verwendung von NHibernete als Datenobjekte gegenüber WCF ist mangelnde Interoperabilität (wie dies auch bei der Verwendung von Datasets der Fall ist). Der Client muss nicht nur .NET verwenden, der Client muss auch NHibernate verwenden. Dies widerspricht den SOA-Prinzipien, aber wenn Sie sicher wissen, dass Sie diese Komponente nicht erneut verwenden werden, gibt es keinen guten Grund, dies nicht zu tun.
Es ist zumindest einen Versuch wert.
Tags und Links wcf nhibernate