переделывать конструкцию объектной модели, чтобы она соответствовала асинхронному извлечению данных - PullRequest
1 голос
/ 29 апреля 2010

У меня смоделирован набор объектов, которые соответствуют реальному миру концепции.

TradeDrug, GenericDrug, TradePackage, DrugForm

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

Чтобы привести конкретный пример

Я могу позвонить

TradeDrug d = Searcher.FindTradeDrug("Zoloft")    or
TradeDrug d = new TradeDrug(34)  

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

GenericDrug generic = d.EquivalentGeneric()
System.Out.WriteLine(generic.ActiveIngredient().Name)

чтобы вернуть дженерик сертралин как объект (снова через фоновый вызов REST на удаленный сервер, на котором есть все эти наркотики детали), а затем, возможно, найти его ингредиент.

Эта модель отлично работает и используется в некоторых приложениях. которые включают обработку данных.

Недавно, однако, я хотел сделать приложение Silverlight, которое использовало и отображало эти объекты. Среда Silverlight позволяет только асинхронный REST / веб-сервис звонки. У меня нет проблем с тем, как сделать асихронные звонки - но у меня проблемы с чем дизайн должен быть для моего объекта строительства.

В настоящее время конструкторы для моих объектов делают некоторые REST вызывает синхронно.

 public TradeDrug(int code)
 {
     form = restclient.FetchForm(code)
     name = restclient.FetchName(code)
     etc..
 }

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

Я могу передать обратный вызов действия конструктору

 public TradeDrug(int code, Action<TradeDrug> constructCompleted)
 {

 }

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

Расширение этого подхода может быть фабричным объектом, который сам по себе имеет асинхронный интерфейс к объектам

 factory.GetTradeDrugAsync(code, completedaction)

или с событием GetTradeDrugCompleted?

У кого-нибудь есть рекомендации? Кто-нибудь знает как новая Reactive Framework может вписаться в любой решение?

1 Ответ

1 голос
/ 29 апреля 2010

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

public static void LoadByIdAsync(int id) { ... }
public static void LoadByIdAsync(int id, object userState) { ... }
public static event LoadByIdCompletedEventHandler LoadByIdCompleted;

Асинхронный шаблон на основе событий описан здесь: http://msdn.microsoft.com/en-us/library/wewwczdw.aspx

...