![]() |
|
Модераторы: gambit, Kefir, Partizan |
![]()
|
|
| jonie |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 2 Всего: 118 |
Читать много, не для слабонервных...
Итак, решил побаловать себя просмотром 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 |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Тоже кажется всё слишком запутанным А разве есть возможность использовать ленивую загрузку когда данные получаем через сервис? |
|||
|
||||
| Chef |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 167 Регистрация: 7.12.2007 Где: РК Павлодар Репутация: нет Всего: нет |
В своей работе делал так:
Создавал DataModel. По ней строил сущности при помощи Domian Service. В СЛ вызывал запросы к сервису. Единственно что очень не удобно это асинхронность. --------------------
Разговоры об IT |
|||
|
||||
| jonie |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 2 Всего: 118 |
к сожалению "данные базы данных" зачастую не равны "данные бизнес объектов". Бизнес объекты например могут отражаться на данные по каким-то бизнес правилам. Именно поэтому я не переносил через RIA Services "базу данных". Вообще мне кажется это не очень хорошей идеей.
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 13 Всего: 59 |
Поддерживаю. Пусть теперь тебе не кажется, а будь уверенным. Переносить базу данных через сервисы, это все равно что иметь прямое подключение к базе данных с клиента. В чем тогда смысл сервисных методов, если они отражают только базу. Сервисы должны отражать бизнес задачи. Сам сервис да, работает с базой через какой-нить DAL, но помимо этого выполняет еще бизнес логику. В противном случае, баланс бизнес логики будет преимущественно на клиентской стороне (если не полностью). -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 2 Всего: 118 |
-Mikle-, на самом деле тут двоякое отношение. Перенос "базы" на SL клиента дает выйгрыш по скорости разработки и как бы это не было странным по логике работы самого ПО (до определенного момента). Например посмотри как работает IdeaBlade DevForce - у них сервер принимает сериализованный Expression, который исполняет и выдает обратно результат. На клиенте в свою очередь прокси классы генерируются (POCO), с которыми и работает клиент...
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 13 Всего: 59 |
Для небольшой системы согласен, можно хоть как делать. Но когда встает вопрос о масштабировании и необходимости предоставлять сервис third-party конторе, возникает много разных НО. Для небольшой системы можно даже OData взять.
-------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| DenWPF |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1659 Регистрация: 26.9.2009 Репутация: нет Всего: 1 |
хнык, дядьки вы о чем =((
|
|||
|
||||
| v00d00 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 28.12.2005 Репутация: нет Всего: нет |
Отпишусь в эпичном треде.
Пишем проект с использованием RIA Services. Поначалу пытались работать с ентити графами на клиенте, но эта идея была впоследствии зафакана. Решили использовать плосские дто. Модель базы данных довольно сложная, порядка 200 сущностей. Причем большая часть сущностей являются дочерними, аля Адрес, Телефон, EMail, Страховка и тд , которые без привязки к компании, эмплою, менеджреу (логическому корню репозитория) не имеют смысла. Обычная вьюха дает возможность работать как раз с таким корнем. Например Контакты эмплоя. На эту вьюху тянется плоский дто, контролы биндятся к дата контексту напрямую. Пользователь поработал, создал/удалил/изменил дочерние сущности. Эта красота гонится на сервис и парсится. И тут начинается ад и Израиль. Парсим дто, валидируем, поэтапно создаем/удаляем энтити. Код довольно простой но однотипный Например:
Весь парсинг в методе апдейтера
Как по мне код, архитектура и сам факт использования RIA как кастрированного WCF сервиса меня напрягают. Если вы смогли прочитать стену текста, надеюсь найдутся силы дать совет. Также интересно как у вас на проектах используется RIA и используется ли вообще? |
||||
|
|||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 2 Всего: 118 |
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 на самом деле тоже зло, ибо зачастую они заводят в жопу, вместо выхода из неё... Это сообщение отредактировал(а) jonie - 10.6.2011, 00:20 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| v00d00 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 28.12.2005 Репутация: нет Всего: нет |
Не нужно быть пуристом, иногда можно EntityQL и SQL загнать. Про запрос на 5к строк, скорее всего у вас все равно хранимка там. По поводу ria. На вашем проекте как разруливаются графы сущностей? Так и гонится через Ria в сгенереных классах? Юзаете presntation view? |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | WPF и Silverlight | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |