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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

Спасибо,

James

5
задан jamiebarrow 31 August 2010 в 18:58
поделиться