我有一些必須按順序執行的調用。考慮具有Query和Load方法的IService。查詢給出了一個小部件列表,並且加載提供了一個「默認」小部件。因此,我的服務看起來像這樣。如何在Silverlight中使用Reactive Extensions(Rx)組織這些調用?
void IService.Query(Action<IEnumerable<Widget>,Exception> callback);
void IService.Load(Action<Widget,Exception> callback);
考慮到這一點,這裏是視圖模型的草圖:
public class ViewModel : BaseViewModel
{
public ViewModel()
{
Widgets = new ObservableCollection<Widget>();
WidgetService.Query((widgets,exception) =>
{
if (exception != null)
{
throw exception;
}
Widgets.Clear();
foreach(var widget in widgets)
{
Widgets.Add(widget);
}
WidgetService.Load((defaultWidget,ex) =>
{
if (ex != null)
{
throw ex;
}
if (defaultWidget != null)
{
CurrentWidget = defaultWidget;
}
}
});
}
public IService WidgetService { get; set; } // assume this is wired up
public ObservableCollection<Widget> Widgets { get; private set; }
private Widget _currentWidget;
public Widget CurrentWidget
{
get { return _currentWidget; }
set
{
_currentWidget = value;
RaisePropertyChanged(()=>CurrentWidget);
}
}
}
我想要做的是簡化調用查詢,然後默認的順序工作流。也許最好的方法是用lambda表達式嵌套,但我認爲Rx可能更優雅。我不想爲了Rx而使用Rx,但是如果它可以讓我組織上面的邏輯,以便在方法中讀取/維護更容易,我會利用它。理想的情況下,是這樣的:
Observable.Create(
()=>firstAction(),
()=>secondAction())
.Subscribe(action=>action(),error=>{ throw error; });
隨着電力線程庫,我願意做這樣的事情:
Service.Query(list=>{result=list};
yield return 1;
ProcessList(result);
Service.Query(widget=>{defaultWidget=widget};
yield return 1;
CurrentWidget = defaultWidget;
這使得它更明顯的是,工作流是順序,並消除嵌套(的收益率異步枚舉器的一部分,並且是阻止直到結果返回的邊界)。
任何類似的東西對我來說都是有意義的。
所以這個問題的本質:我是否試圖將一個方形釘嵌入圓孔中,或者有沒有一種方法可以使用Rx重新定義嵌套的異步調用?
我一直在尋找這個問題類似的東西:http://stackoverflow.com/questions/3280345/is-there-a -useful-design-pattern-for-chained-asynchronous-event-calls - 如果你能回答我的問題與你的經驗,將不勝感激=) – 2010-08-18 11:52:00
我正在研究概念證明顯示聚合多個(不同)服務調用並按順序執行它們。準備就緒時會通知你! – 2010-08-19 01:29:06