Verwenden von WCF DataContract in MVC SessionState mithilfe von AppFabric-Cache

Ich habe eine Datenzugriffsschicht, eine Dienstschicht und eine Präsentationsschicht. Die Präsentationsschicht ist ASP.NET MVC2 RTM (Web) und die Serviceschicht ist WCF (Services). Es ist alles .NET 3.5 SP1.

Das Problem ist, dass in den Services die zurückgegebenen Objekte mit dem @ gekennzeichnet sin[DataContract] Attribut. Das Web verwendet den SessionStateProvider von AppFabric Cache (a.k.a Velocity) zum Speichern des Sitzungsstatus. Aus diesem Grund muss alles, was ich in der Sitzung speichere, serialisierbar sein.

Hier kommt das Problem: die DataContracts sind nicht mit @ markie[Serializable] und soweit ich mich erinnern kann, indem ich es einer Klasse vorstelle, die bereits mit @ markiert i[DataContract] Es treten einige Probleme auf, und deshalb glaube ich nicht, dass dies eine Lösung ist.

Ich hatte ursprünglich vor, die DataContracts direkt in der Webebene zu verwenden und sie als Modelle für Ansichten zu verwenden, die sich auf das Rendern der DataContracts beziehen (wahrscheinlich in einer ViewModel-Klasse höherer Ebene verschachtelt). Aber da der Sitzungsstatusanbieter die Serialisierung aller darin gespeicherten Objekte erfordert, beginne ich, diese Strategie zu überdenken. Es wäre jedoch schön, da sie Validierungslogik enthalten, die das @ verwendeIDataErrorInfo interface und dieselbe Validierungslogik könnten in MVC als Teil der Modellbindung wiederverwendet werden.

Was ist Ihrer Meinung nach der beste Weg, um den Arbeitsaufwand zu reduzieren?

Ich habe mir momentan die folgenden Möglichkeiten überlegt:

EIN. Erstellen Sie einen 'ServiceIntegration'-Teil im Webprojekt.

Dies wäre ein Mittelmann zwischen meinen Controllern und meiner WCF-Service-Schicht. Der ServiceIntegration-Teil würde mithilfe von DataContracts mit der Service-Schicht und mithilfe von ViewModels mit der Web-Schicht kommunizieren, müsste jedoch mithilfe eines bidirektionalen Transformers zwischen DataContracts und ViewModels umwandeln.

Auch, da die IDataErrorInfo-Validierung nicht wiederverwendbar wäre, müsste auch ein Validator pro DataContract erstellt werden, der den Transformer zur Konvertierung von ViewModel nach DataContract verwendet, eine Validierung mit IDataErrorInfo durchführt und dessen Ergebnisse zurückgibt. Dies würde dann in Aktionsmethoden von Controllern verwendet werden (z. B.if (!MyValidator.IsValid(viewModel)) return View();)

Verschiedene Klassen erforderlich: xDataContract, xViewModel, xTransformer, xValidator

B. Erstellen Sie einen 'SessionIntegration'-Teil im Webprojekt

Dies wäre ein Mittelmann zwischen den Controllern (oder allen, die auf die Sitzung zugreifen) und der Sitzung selbst. Alles, was Zugriff auf die Sitzung benötigt, würde diese Klasse durchlaufen. DataContracts werden in der gesamten Anwendung verwendet, sofern sie nicht in der Sitzung gespeichert werden. Der SessionIntegration-Teil übernimmt die Verantwortung für die Umwandlung des DataContract in eine ISerializable-Form und zurück. Aufgrund der Verwendung der IDataErrorInfo-Schnittstelle für den DataContract ist kein zusätzlicher Validator erforderlich.

Verschiedene Klassen erforderlich: xDataContract, xTransformer, xSerializableForm

Hinweis: In beiden Szenarien gäbe es immer noch ViewModels, aber mit (B) könnte ich ViewModels aus DataContracts zusammenstellen.

(B) hat den Vorteil, dass kein zusätzlicher Prüfer erforderlich ist.

Bevor ich losgehe und (A) / (B) vollständig implementiere, hätte ich gerne ein Feedback. Momentan neige ich mich zu (B), aber (A) ist möglicherweise flexibler. In jedem Fall scheint es viel zu viel Arbeit für das zu geben, was es wert ist. Ist noch jemandem dieses Problem begegnet, sind Sie mit mir einverstanden / nicht einverstanden und / oder haben Sie eine andere Möglichkeit, das Problem zu lösen?

Vielen Dank

Jame

Antworten auf die Frage(4)

Ihre Antwort auf die Frage