2010-01-05 20 views
8

Wie oben beschrieben, implementiere ich eine mehrstufige Architektur, um mit WCF und Entity Framework 4 (mit poco) zu arbeiten. Da ich bei POCO bereits Beharrlichkeits-Ignoranz habe, muss ich DTO implementieren, oder kann ich WCF rein nutzen?Verwenden eines WCF-Dienstes mit Entity Framework 4 und ... DTO?

Das Hauptzitat ist - ich brauche DTO, um ein leichtes Objekt im Netzwerk zu übergeben, oder ich kann meine POCO-Entitäten verwenden.

Was Sie empfehlen?

+1

DTOs und POCOs sind nicht gleich. Schauen Sie sich [diesen netten Post] an (http://rlacovara.blogspot.com/2009/03/what-is-difference-between-dto-and-poco.html?m=1). Wenn Sie DTOs verwenden, können Sie mithilfe von [EntitiesToDTOs] (http://entitiestodtos.codeplex.com) automatisch DTOs aus Ihrer Entity Framework EDMX-Datei generieren. – kzfabi

Antwort

3

Es ist schwer zu beantworten, wenn Sie nicht definieren, was der "reine Weg" ist. Sprechen wir SOA pur oder WCF rein?

WCF-Proxys sind bereits DTOs, da sie keine Geschäftslogik über Ihren Servicevertrag hinweg mit sich bringen. Das Erstellen einer weiteren DTO-Schicht über den von WCF generierten Proxyklassen erscheint redundant.

Die größte Frage, die Sie beantworten möchten, ist "wie SOA ist diese Lösung?". Sie können Ihre POCO-Entitäten nicht über Servicegrenzen hinweg freigeben, wenn Sie SOA-konform sein möchten. Bei SOA geht es um unterschiedliche Verträge.

Wenn Sie alle SOA-basiert gehen, verlieren Sie eine Menge Funktionalität, weil die Klassen, mit denen Ihre Web-Tier die meiste Zeit arbeitet, dumme Proxies sein werden. Sie müssen eine Menge Logik wiederholen, und Sie haben viel von der Funktionalität "Metadaten, Konvention über Konfiguration" verloren, die MVC 2 bietet.

Wenn Sie das SOA-Buzzword in den Shredder werfen, was Sie tun sollten (http://soafacts.com/), dann wird es viel einfacher sein, Geschäftslogik und Metadaten-Informationen über mehrere Ebenen hinweg zu teilen. Wenn der einzige Verbraucher Ihres Webdienstes Sie selbst ist, dann ist diese Methode wahrscheinlich die beste Wahl.

Hier können Sie DTOs verwenden, um anstelle der POCO-Entitäten über die Leitung zu senden. Der einzige Nachteil ist wieder, wiederholte Logik und viele Kesselplatte zeremoniellen Code, der nichts tut. Kommt wirklich auf die Größe Ihres Projekts an. Wenn es klein ist, vergiss DTOs, aber wenn du 20 Entwickler hast, die mit 200.000 LoC arbeiten, dann sind DTOs wahrscheinlich wert, erstellt zu werden.

1

Wie Jfar gesagt hat, hängt es davon ab, ob Sie zu dem sein werden, der nur den Service konsumiert, oder ob die Präsentationsebene nur Sie sein wird.

Wenn Sie das später tun und Sie nur Ihren Dienst verwenden werden, können Sie POCOs über die WCF-Dienstgrenzen serialisieren. Dies ist etwas, das ich kürzlich getan habe und schrieb dieses blog post darüber, es zur Arbeit zu bringen. Auf diese Weise können Sie die gleichen Entitäten in der App-Ebene und der Präsentationsebene verwenden.

Ich hoffe, es hilft.

1

Der beste Grund, ein DTO bei der Verwendung von WCF mit EF zu empfehlen, ist, dass EF-Datenbank-erste Klassen Implementierungsabhängigkeiten in Ihre Proxy-Klassen ziehen. Wenn Sie Code-First mit POCO-Klassen verwenden, sollten keine Implementierungsabhängigkeiten vorhanden sein.

Versuchen Sie, nur Ihre POCO-Klassen zurückzugeben, aber sehen Sie sich die generierten Proxy-Klassen genauer an. Stellen Sie sicher, dass in den Klassen, die Teil der EF-Infrastruktur sind, nichts vorhanden ist. Wenn die Proxy-Klassen sauber sind, sollten Sie alle eingestellt sein.

Verwandte Themen