Silverlight, асинхронная, ленивая загрузка, как лучше?

Я начал использовать silverlight / flex и сразу столкнулся с асинхронным вызовом службы. Я привык решать проблемы доступа к данным OO-способом с одним механизмом выборки сервера или другим.

У меня есть следующий пример тривиального кода:

public double ComputeOrderTotal(Order order) 
{ 
   double total = 0;
   // OrderLines are lazy loaded
   foreach (Orderline line in order.Orderlines) 
   { 
       // Article,customer are lazy loaded 
       total = total + line.Article.Price - order.Customer.discount;
   }
   return total;
}

Если я правильно понимаю, этот код невозможен во Flex / Silverlight. Ленивая загрузка заставляет вас работать с обратными вызовами. IMO простой пример выше будет большим беспорядком.

Может ли кто-нибудь дать мне структурированный способ реализации вышеизложенного?

Редактировать:

  • Проблема та же для Flex / Silverlight, псевдокод будет хорошо
  • Это на самом деле не связано с ORM, но большинство форм используют ленивую загрузку, поэтому я уберу этот тег
  • Проблема в ленивой загрузке в модели
  • Приведенный выше пример был бы очень выполнимым из всех данных, находящихся в памяти, но мы предполагаем, что некоторые должны быть получены с сервера
  • Closueres не помогают, так как иногда данные уже загружены и асинхронная выборка не требуется
10.12.2008 08:23:05
Silverlight и Flex - две разные технологии, вы просите примеры, использующие обе?
grapefrukt 10.12.2008 15:10:53
да, так как это одна и та же проблема для обоих
Julian de Wit 12.11.2010 12:06:46
7 ОТВЕТОВ

Silverlight - это клиентская технология, и объектно-реляционное отображение происходит полностью на сервере. Таким образом, вы должны забыть об ORM в Silverlight.

Следуя вашему примеру, вы должны создать веб-сервис (SOAP, REST ...), который может предоставить вашему клиенту Silverlight полный объект «Заказ». Если у вас есть объект, вы можете работать с ним, не общаясь с сервером в обычном режиме - синхронно.

0
12.12.2008 11:07:49
Вы правы ORM на сервере неправильный тег. Что если по какой-то причине у Клиента есть свойство OrderHistory ... Когда я получу клиента, он загрузит историю. Каждый заказ в истории будет загружать клиентов, которые будут загружать историю. Конечный результат: вся база данных извлекается.
Julian de Wit 21.01.2009 10:08:57

Да, я должен согласиться с тем, что отображение O / R обычно выполняется на стороне сервера вашего приложения. В SilverLight асинхронный способ выполнения является желаемым шаблоном для использования при работе со службами. Почему услуги? Потому что, как я уже говорил, в настоящее время нет инструмента отображения O / R, который можно было бы использовать на стороне клиента (SilverLight). Наилучший подход состоит в том, чтобы отображать данные O / R в службе, которая может использоваться приложением SilverLight. На данный момент лучшим способом является использование Ado.Net DataServices для передачи данных, а на стороне клиента - для управления данными с помощью LINQ to Services. Что действительно интересно в ADS (бывший проект Astoria), так это то, что он разработан для использования с Entity Framework, но хорошие люди также реализовали поддержку IQueriable, так что в основном вы можете подключить любого поставщика данных, который поддерживает LINQ.OpenAccess , LLBLGen и т. Д. Чтобы отправить обновления обратно на сервер, источник данных необходим для поддержки ADS IUpdateable.

Вы можете посмотреть, как именно это можно сделать, в серии постов, которые я подготовил здесь: Начало работы с ADO.NET Data Services и Telerik Open Access.

1
19.12.2008 08:05:55
Извините неправильный тег .. Это не orm .. Это ленивая загрузка, которая является проблемой.
Julian de Wit 21.01.2009 10:09:52

Я не могу говорить с Silverlight, но Flex - это клиентская технология веб-браузера, в которой нет драйвера базы данных, встроенного в среду выполнения Flash. Вместо этого вы можете взаимодействовать по протоколу HTTP с веб-сервером. Он находится на веб-сервере среднего уровня, где вы будете выполнять любые ORM в отношении соединения с базой данных, такие как Java JDBC. Hibernate ORM и iBATIS - два популярных варианта в пространстве среднего уровня Java.

Также из-за этого:

Ошибки распределенных вычислений

Вы не выполняете синхронные взаимодействия между клиентом Flex и его сервисами среднего уровня. Синхронные сетевые операции стали верботенами в наши дни и являются отличительной чертой плохо разработанного приложения - поскольку по причинам, перечисленным в приведенной выше ссылке, приложение может (и часто будет) демонстрировать очень плохой пользовательский опыт.

Вместо этого вы делаете асинхронные вызовы для извлечения данных, загружаете данные в объект (ы) модели вашего клиентского приложения и приступаете к выполнению операций с моделью. С Flex и BlazeDS вы также можете передавать данные среднего уровня клиенту и асинхронно обновлять объекты модели клиента. (Привязка данных - это один из способов реагирования на обновления данных в зависимости от событий.)

Все это, вероятно, кажется очень далеким от природы запроса в вашей публикации, но ваша публикация указывает на то, что вы совершенно неверно понимаете, как понимать технологии на стороне клиента, в которых асинхронное и управляемое событиями программирование превращается в фундамент архитектура. Эти клиентские технологии RIA разработаны таким образом полностью специально. Таким образом, вам нужно изучить их образ мышления, если вы хотите иметь хороший и продуктивный опыт их использования.

Я расскажу об этом более подробно и с точки зрения Flex в этой статье:

Гибкий асинхронный ввод-вывод против явных потоков в Java и C #

1
23.12.2008 02:47:52
Я также занимался гибким программированием и поддерживал синхронизацию с помощью datapush. Я использовал реализацию .net, которая была очень похожа на blaseDS. Но все же иногда вам не нужны все данные в памяти.
Julian de Wit 21.01.2009 10:12:05
Практически любая реализация на стороне веб-сервера может реализовать Comet Pattern (или длинный опрос) в качестве средства для передачи данных. Одно из преимуществ BlazeDS на основе Java заключается в том, что его можно модифицировать для работы на Java NIO, что позволяет масштабировать до 10 000–20 000 одновременных подключений к серверу.
RogerV 22.01.2009 02:34:16

В моем непосредственном опыте с Flex я думаю, что это обсуждение становится слишком сложным.

Ваше концептуальное представление ОО ничем не отличается между синхронизацией и асинхронностью. Единственное отличие состоит в том, что вы используете обработчики событий для обработки диалога с хостом в DAL, а не что-то возвращаемое из вызова метода. И это часто происходит полностью на стороне хоста и не имеет ничего общего с Flex или Silverlight. (Если вы используете AIR для приложения рабочей станции, то это может быть в клиентском коде, но то же самое применимо. Также, если вы используете длительный AJAX. Silverlight, конечно, не имеет эквивалента AIR.)

Я смог спроектировать все, что мне нужно, без каких-либо других изменений, необходимых для обеспечения асинхронности.

1
23.12.2008 02:55:19

Flex имеет однопоточную модель. Если вы сделаете синхронный вызов веб-серверу, вы заблокируете весь графический интерфейс приложения. У пользователя будет замороженное приложение до завершения вызова (или истечения времени ожидания в случае ошибки сети и т. Д.).

Конечно, настоящие программы RIA написаны не так. Их GUI остается доступным и отзывчивым для пользователя благодаря использованию асинхронных вызовов. Это также позволяет иметь реальные индикаторы прогресса, которые предлагают кнопки отмены и тому подобное, если природа взаимодействия требует этого.

Старые плохие пользовательские приложения Web 1.0 демонстрировали синхронное поведение при взаимодействии с веб-уровнем.

Как указано в моей статье, асинхронная однопотоковая модель в сочетании с замыканиями ActionScript3 - это хорошо, потому что это гораздо более простая модель программирования, чем альтернатива - написание многопоточных приложений. Многопоточность была подходом к написанию клиент-серверных приложений на Java Swing или C # .NET WinForm для обеспечения одинаково гибкого и гибкого пользовательского интерфейса в GUI.

Вот еще одна статья, которая углубляется в эту тему асинхронной, распределенной / управляемой событиями архитектуры распределенных приложений:

Построение эффективных распределенных программных систем предприятия. Коммуникация на основе данных, а не на основе поведения.

1
23.12.2008 05:42:48

Говоря о Silverlight, обязательно стоит проверить сервисы RIA .

Проще говоря, он переносит DataContext с сервера на клиент, откуда вы можете асинхронно запрашивать его (нет необходимости писать сервисы WCF вручную, все это делается RIA).

0
21.12.2009 16:23:26
РЕШЕНИЕ

C # 5 асинхронная / ожидающая конструкция будет почти то, что я хочу ..

смотреть презентацию Андерса Хейлсберга

0
12.11.2010 12:04:49