重做对象模型构造以适应异步数据获取

时间:2010-04-29 02:37:25

标签: .net silverlight oop asynchronous class-design

我有一组与一些真实世界相对应的对象 概念

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 / Web服务调用。我对如何制作没有任何问题 不正常的电话 - 但我遇到了什么麻烦 设计应该是我的对象构造。

目前我的对象的构造函数做了一些 REST以同步方式调用。

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

如果我必须使用异步“事件”或“操作”才能使用 Silverlight Web客户端(我知道silverlight可以 被迫成为同步客户但我感兴趣 非同步方法),有没有人有指导 或者如何构建我的对象的最佳实践。

我可以将动作回调传递给构造函数

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

 }

但是这允许用户拥有TradeDrug 在我想要构造之前的对象实例 实际上已经完成了它也不支持 'event'异步模式,因为该对象不存在 将事件添加到构建之前。

扩展该方法可能是一个工厂对象本身 有一个对象的异步接口

 factory.GetTradeDrugAsync(code, completedaction)

或使用GetTradeDrugCompleted事件?

有人有任何建议吗?有人知道吗 新的Reactive框架如何适用于任何 溶液

1 个答案:

答案 0 :(得分:1)

我会抛弃公共构造函数并使用异步工厂方法。它不一定是一个单独的工厂对象,它可能只是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