我有一组与一些真实世界相对应的对象 概念
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框架如何适用于任何 溶液
答案 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