Хочу расказать хабрасообществу об опыте знакомства з ADO.Net Data Services aka Astoria, и, по если кому-то понравится — получить приглашение.
Сейчас пишу маленький проект с использованием Microsoft'овського O/RM ADO.Net Entity Framework. Если не обращать внимания на некоторые врожденные болячки, с кторыми я уже научился боротся, результаты целиком удовлетворительные. Мое приложение являет собой типичный распределенный клиент(WPF)/сервер(WCF): данные жывут на сервере, клиент дергает его за каждый байт инфы. Так же данные и обновляються. На прошлой неделе я целиком случайно увидел відео, посвященные ADO.Net Data Services, также известной как Astoria, и просто офигел.
Видео можна посмотреть здесь, а на палцах — это сервис, который представляет клиенту в полное распоряжение Entity Framework'овскую модель. Ну тоесть при експорте сервиса на клиенте создается полная реплика модели, включая контекст, из которого можна брати объекты, менять, комитить — все так, будто-бы я работал с моделлю не через сервис, а локально.
Конечно, мене это очень искусило. В моделе WCF/WPF мне для каждого запроса приходилось создавать на сервере метод, протаскивать его через прокси… А тут все можна делать прямо на клиенте. Минимум на треть меньше кода, да і код стает елегантнее.
Итак, сегодня я угробив пол дня на то, чтобы попробовать перевести приложение на Astorию.
Результат получился негативным, но давайте по очереди.
Суть рефакторинга: функции из сервиса были винлайнены в клиент, причом происходила подмена контекстов.
Грабли №раз. Метод Include, который определяет, какие связанные данные нам нужно подтягивать вместе с объектом, отсутсвует. Первая мысль — круто, они подтягиваються on demand! Все методы Include ушли.
Легкая обработка напильником, и клиент скомпилился. Ура! Я даже не думав, что будет так легко.
Запускаю проект, и тут же вылет (грабли №два). Single(predicate) not supported. Черт! Ладно… Пробуем First(). То самое… Грр! Where(predicate).Single(). Как и ожыдалось — пошло.
Итак, со скрипом, но завелись. Хм. А где мои данные???
А нету у меня даних. Колекции зависимых данных — пустые.
Грабли №3. Прорвемся… Смотрим список методов в EntitySetа… Есть Expand! Ха… Тот самый Include, тільки синтаксис через слеш вместо через точку… Возвращаю на место старые Includы, тольки тепер уже как Expandы. Заводжу — есть контакт, правда с второй попытки — слешы были не в ту сторону.
Менше з ним. С выгребанием данных более-менее разобрались. Тепер что нам скажет апдейт?
Апдейт каже «An error occurred while processing this request.»
А что у нас в иннер ексепшине? Нету такого поля на сервере… Глупое! Ясно что нету… Я его в паршиал класе на клиенте доклеил!
Ладно… извращаемся, паршиал класи переписываем в врапперы. Запускаем… Апдейт.
«An error occurred while processing this request.»
Иннер? Тоже саме. Вообще класно. И как я узнаю, что случилось???? На этой мажорной ноте я послав Асторию под три чорта, хотя это была не единствення причина.
Еще двума существенными аргументами были проблемы с формзовськой аутентификацией, которая просто тупо не работала (при любом запросе — логин пейдж), и я так и не смог найти нормального солюшина для этого, а также невозможность разделить доступ на сервере — тоесть если юзер имеет доступ к сервису — он имеет доступ ко всему. Была идея — создать несколько сервисов, и настроить каждый по отдельности, но она шибко извращенная.
Вердикт: слишком сыро. Возможно в 4.0 оно будет юзабельнее, но пока-что: Revert All.
Сейчас пишу маленький проект с использованием Microsoft'овського O/RM ADO.Net Entity Framework. Если не обращать внимания на некоторые врожденные болячки, с кторыми я уже научился боротся, результаты целиком удовлетворительные. Мое приложение являет собой типичный распределенный клиент(WPF)/сервер(WCF): данные жывут на сервере, клиент дергает его за каждый байт инфы. Так же данные и обновляються. На прошлой неделе я целиком случайно увидел відео, посвященные ADO.Net Data Services, также известной как Astoria, и просто офигел.
Видео можна посмотреть здесь, а на палцах — это сервис, который представляет клиенту в полное распоряжение Entity Framework'овскую модель. Ну тоесть при експорте сервиса на клиенте создается полная реплика модели, включая контекст, из которого можна брати объекты, менять, комитить — все так, будто-бы я работал с моделлю не через сервис, а локально.
Конечно, мене это очень искусило. В моделе WCF/WPF мне для каждого запроса приходилось создавать на сервере метод, протаскивать его через прокси… А тут все можна делать прямо на клиенте. Минимум на треть меньше кода, да і код стает елегантнее.
Итак, сегодня я угробив пол дня на то, чтобы попробовать перевести приложение на Astorию.
Результат получился негативным, но давайте по очереди.
Суть рефакторинга: функции из сервиса были винлайнены в клиент, причом происходила подмена контекстов.
Грабли №раз. Метод Include, который определяет, какие связанные данные нам нужно подтягивать вместе с объектом, отсутсвует. Первая мысль — круто, они подтягиваються on demand! Все методы Include ушли.
Легкая обработка напильником, и клиент скомпилился. Ура! Я даже не думав, что будет так легко.
Запускаю проект, и тут же вылет (грабли №два). Single(predicate) not supported. Черт! Ладно… Пробуем First(). То самое… Грр! Where(predicate).Single(). Как и ожыдалось — пошло.
Итак, со скрипом, но завелись. Хм. А где мои данные???
А нету у меня даних. Колекции зависимых данных — пустые.
Грабли №3. Прорвемся… Смотрим список методов в EntitySetа… Есть Expand! Ха… Тот самый Include, тільки синтаксис через слеш вместо через точку… Возвращаю на место старые Includы, тольки тепер уже как Expandы. Заводжу — есть контакт, правда с второй попытки — слешы были не в ту сторону.
Менше з ним. С выгребанием данных более-менее разобрались. Тепер что нам скажет апдейт?
Апдейт каже «An error occurred while processing this request.»
А что у нас в иннер ексепшине? Нету такого поля на сервере… Глупое! Ясно что нету… Я его в паршиал класе на клиенте доклеил!
Ладно… извращаемся, паршиал класи переписываем в врапперы. Запускаем… Апдейт.
«An error occurred while processing this request.»
Иннер? Тоже саме. Вообще класно. И как я узнаю, что случилось???? На этой мажорной ноте я послав Асторию под три чорта, хотя это была не единствення причина.
Еще двума существенными аргументами были проблемы с формзовськой аутентификацией, которая просто тупо не работала (при любом запросе — логин пейдж), и я так и не смог найти нормального солюшина для этого, а также невозможность разделить доступ на сервере — тоесть если юзер имеет доступ к сервису — он имеет доступ ко всему. Была идея — создать несколько сервисов, и настроить каждый по отдельности, но она шибко извращенная.
Вердикт: слишком сыро. Возможно в 4.0 оно будет юзабельнее, но пока-что: Revert All.