Использование WCF DataContract в MVC SessionState с использованием кэша AppFabric

У меня есть уровень доступа к данным, уровень обслуживания и уровень представления. Уровень представления - это ASP.NET MVC2 RTM (веб), а уровень обслуживания - WCF (службы). Это все .NET 3.5 SP1.

Проблема в том, что в сервисах возвращаемые объекты помечаются[DataContract] приписывать. В Интернете используется SessionStateProvider AppFabric Cache (a.k.a Velocity) для хранения состояния сеанса. Из-за этого все, что я храню в сеансе, должно быть сериализуемым.

Здесь возникает проблема: DataContracts не помечены[Serializable] и, насколько я помню, вводя его в класс, уже отмеченный[DataContract] возникают некоторые проблемы, и поэтому я не верю, что это решение.

Первоначально я планировал использовать DataContracts прямо в веб-слое, используя их в качестве моделей для представлений, связанных с рендерингом DataContracts (возможно, вложенных в класс ViewModel более высокого уровня). Но из-за того, что поставщик состояния сеанса требует, чтобы все объекты, хранящиеся в нем, были сериализуемыми, я начинаю переосмысливать эту стратегию. Было бы неплохо иметь, хотя, так как они содержат логику проверки с использованиемIDataErrorInfo интерфейс, и та же логика проверки может быть повторно использована в MVC как часть привязки модели.

Что, по вашему мнению, является лучшим способом, позволяющим мне сократить необходимую работу?

В настоящее время я думал о следующих разных путях:

A. Создайте часть «ServiceIntegration» в веб-проекте.

Это был бы посредник между моими контроллерами и моим сервисным уровнем WCF. Часть ServiceIntegration будет взаимодействовать с сервисным уровнем, используя DataContracts, и с веб-уровнем, используя ViewModels, но должна преобразовывать DataContracts и ViewModels, используя двусторонний Transformer.

Кроме того, поскольку проверка IDataErrorInfo не будет использоваться повторно, необходимо также создать валидатор для DataContract, который использует Transformer для преобразования из ViewModel в DataContract, выполнения проверки с использованием IDataErrorInfo и возврата результатов. Это затем будет использоваться внутри методов действия контроллеров (например,if (!MyValidator.IsValid(viewModel)) return View();)

Требуются разные классы: xDataContract, xViewModel, xTransformer, xValidator

Б. Создайте часть «SessionIntegration» в веб-проекте.

Это будет посредник между контроллерами (или чем-либо, осуществляющим доступ к сеансу) и самим сеансом. Все, что требует доступа к сеансу, проходит через этот класс. DataContracts будет использоваться во всем приложении, если только они не сохраняются в сеансе. Часть SessionIntegration будет нести ответственность за преобразование DataContract в некоторую ISerializable форму и обратно. Дополнительный валидатор не требуется из-за использования интерфейса IDataErrorInfo в DataContract.

Требуются разные классы: xDataContract, xTransformer, xSerializableForm

Примечание: в обоих сценариях все еще будут присутствовать ViewModel, однако с помощью (B) я смогу составить ViewModel из DataContracts.

(B) имеет то преимущество, что не нуждается в дополнительном валидаторе.

Прежде чем я уйду и полностью реализую (A) / (B), я хотел бы получить некоторую обратную связь. В данный момент я начинаю склоняться к (B), однако (A) может быть более гибким. В любом случае, кажется, что слишком много работы для того, что это стоит. Кто-нибудь еще сталкивался с этой проблемой, вы согласны / не согласны со мной и / или у вас есть какой-то другой способ решения проблемы?

Спасибо,

Джеймс

Ответы на вопрос(2)

Ваш ответ на вопрос