| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > WPF и Silverlight > Взгляд на RIA Services (.net4) |
| Автор: jonie 23.9.2010, 00:49 | ||||||||
| Читать много, не для слабонервных... Итак, решил побаловать себя просмотром RIA Services в .NET 4 (SL4). Просто примеры это неинтересно, посему решил сделать нечто более приближенное к реальности. Итак, исходно имеется база данных (mssql2008r2) с таблицей и некой view на эту таблицу. Задача: отобразить данные в SL гриде из view, дать возможность добавить в таблицу. Как решил делать: 1) EF4 как слой Data Access Layer 2) Написал свой класс (POCO ) для пробрасывания в SL. Я не стал использовать генерацию, что предлагается при добавлении DomainService-а, т.к. у нас источник для получения записей и источник для внесения записей различен. Вот такой вот POCO объект получился:
NotifyPropertyChanged это атрибут для использования совместо с PostSharp (автоматическая реализация INotifyPropertyChanged), к сути дела не имеет отношения. 3) Написал сервис:
где ITaskJournalRepository нужно для инжектирования зависимости репозитория вида:
Процесс инжектирования поручил Unity 2.0 в Global.asax:
Ок, у нас есть сервис позволяющий отдавать POCO сущности и даже судя по трассировке к базе вполне себе нормальные запросы строит (оборачивает select * запрос в запрос конкретных полей, указанных в перечислении при создании POCO объекта). Аналогичным методом думаю добавить и добавление.... ИТОГО для тех кому лень читать получается схема: 1) Silverlight запрашивает данные у RIA сервиса 2) хост создает RIA сервис, используя DomainServiceFactory, который получает собственно экземпляр сервиса с инжектированными через Unity зависимостями 3) сервис используя инжектированный IRepository запрашивает данынные у него 4) IRepository выполняет запрос на базе данных используя EntityFramework, и производит маппинг на POCO объекты, которые и возращает 5) силвералайт получает POCO и использует их. Так вот вопросы: 1) А правильной ли дорогой я иду и нет ли методов попроще? 2) А что насчет ленивой загрузки связанных коллекций? Пример солюшена выложу завтра (постараюсь).... |
| Автор: Rohoss 15.4.2011, 23:40 |
Тоже кажется всё слишком запутанным А разве есть возможность использовать ленивую загрузку когда данные получаем через сервис? |
| Автор: Chef 21.4.2011, 20:30 |
| В своей работе делал так: Создавал DataModel. По ней строил сущности при помощи Domian Service. В СЛ вызывал запросы к сервису. Единственно что очень не удобно это асинхронность. |
| Автор: -Mikle- 22.4.2011, 08:05 | ||
Поддерживаю. Пусть теперь тебе не кажется, а будь уверенным. Переносить базу данных через сервисы, это все равно что иметь прямое подключение к базе данных с клиента. В чем тогда смысл сервисных методов, если они отражают только базу. Сервисы должны отражать бизнес задачи. Сам сервис да, работает с базой через какой-нить DAL, но помимо этого выполняет еще бизнес логику. В противном случае, баланс бизнес логики будет преимущественно на клиентской стороне (если не полностью). |
| Автор: jonie 22.4.2011, 08:58 |
| -Mikle-, на самом деле тут двоякое отношение. Перенос "базы" на SL клиента дает выйгрыш по скорости разработки и как бы это не было странным по логике работы самого ПО (до определенного момента). Например посмотри как работает IdeaBlade DevForce - у них сервер принимает сериализованный Expression, который исполняет и выдает обратно результат. На клиенте в свою очередь прокси классы генерируются (POCO), с которыми и работает клиент... |
| Автор: -Mikle- 25.4.2011, 09:52 |
| Для небольшой системы согласен, можно хоть как делать. Но когда встает вопрос о масштабировании и необходимости предоставлять сервис third-party конторе, возникает много разных НО. Для небольшой системы можно даже OData взять. |
| Автор: DenWPF 9.6.2011, 22:42 |
| хнык, дядьки вы о чем =(( |
| Автор: v00d00 9.6.2011, 23:05 | ||||
| Отпишусь в эпичном треде. Пишем проект с использованием RIA Services. Поначалу пытались работать с ентити графами на клиенте, но эта идея была впоследствии зафакана. Решили использовать плосские дто. Модель базы данных довольно сложная, порядка 200 сущностей. Причем большая часть сущностей являются дочерними, аля Адрес, Телефон, EMail, Страховка и тд , которые без привязки к компании, эмплою, менеджреу (логическому корню репозитория) не имеют смысла. Обычная вьюха дает возможность работать как раз с таким корнем. Например Контакты эмплоя. На эту вьюху тянется плоский дто, контролы биндятся к дата контексту напрямую. Пользователь поработал, создал/удалил/изменил дочерние сущности. Эта красота гонится на сервис и парсится. И тут начинается ад и Израиль. Парсим дто, валидируем, поэтапно создаем/удаляем энтити. Код довольно простой но однотипный Например:
Весь парсинг в методе апдейтера
Как по мне код, архитектура и сам факт использования RIA как кастрированного WCF сервиса меня напрягают. Если вы смогли прочитать стену текста, надеюсь найдутся силы дать совет. Также интересно как у вас на проектах используется RIA и используется ли вообще? |
| Автор: jonie 10.6.2011, 00:18 | ||
| v00d00, у меня есть проект на WCF.RIA и используя IdeaBlade.DevForce for SL. В обоих проектах в базе около 800 таблиц. По поводу первого - да, это израильский АдЪ. Я не считал, но около 2 тыс бизнес объектов там точно есть. По поводу второго - адЪ не многим лучше, но... но бизнес объектов как таковых нет, есть почти что "клиент-сервер"... что в большой степени помогает быстро разработать интерфейс и не думать о "бизнесе", занеся всю логику прямо на клиента. Важно: оба проекта для intranet-а, поэтому к ним не предъявляется уж сильно больших требований по безопасности. Опишу проблему (пишу прямо тут, так что мб ошибки). Есть база ТелефонныйСправочникНаРаботе {юзер, департамент, телефоны}. Примерно такой:
Ставится следующая задача: 1) отобразить на странице (неважно SL или asp.net или winforms) три грида "мастер-детали" по таблицам выше 2) при редактировании юзера отображать форму: textbox имя, combobox департамент, grid номера. 3) предусмотреть "простую форму" просмотра юзеров - грид вида {имя, департамент, список телефонов через запятую } везде в гридах надо уметь делать фильтрацию, группировки. Естественно с пйджингом (у нас работает 10 млн пользователей). Проблемы: 1) если мы не юзаем wcf ria сервисы, то нам как-то надо сериализовать Expression<Funct<...>> - по сути условие фильтра или группировки. Если юзаем wcf ria то он это делает за нас как я понимаю... 2) проблема с п3 - это то что мы не очень-то хотим передавать на клиента данные, которые нам не нужны дляотображения информации (например DepartamentId). 3) IsDeleted нам как и в случае п2 вообще на клиенте не нужен (у нас например может быть фото юзера - не грузить же его каждый раз при просмотре списка юзеров, а отдельную таблицу заводить - нууу сомнительное удовольствие). Попробуй реализовать этот простой пример - увидишь что проблем на самом деле не так и мало.... и вот как их решить это и есть обсуждаемый вопрос 8-) В частности я предложил "начало" - не использовать в DomainSources (основа wcf ria) генерируемые EF-ком сущности. Ибо они не отвечают п2 и п3. Также в этих рамках я сразу предложил отказаться от прямого использования EF в слое Service-ов - это решит проблему "фильтрация по признаку IsDeleted" на уровне Repository. Также слой репозитория поможет нам разруливать ситуации когда мы тянем данные из view-шек базы (многие реальные запросы очень сложны (у меня есть запросы select на 5 тыс. строк) чтобы писать их в linq. Кроме того linq не даст нам оптимизированный код запроса), а записываем в реальные таблицы (притом, возможно, не в одну). Такие дела... Говоря вообще про всякие такие красивые вещи вроде EF или NHibernate - я в реальных бизнес приложениях уже начинаю считать что эти ORM на самом деле тоже зло, ибо зачастую они заводят в жопу, вместо выхода из неё... |
| Автор: v00d00 10.6.2011, 00:58 | ||
Не нужно быть пуристом, иногда можно EntityQL и SQL загнать. Про запрос на 5к строк, скорее всего у вас все равно хранимка там. По поводу ria. На вашем проекте как разруливаются графы сущностей? Так и гонится через Ria в сгенереных классах? Юзаете presntation view? |