2011-08-01 36 views
0

我正在使用Silverlight和RIA Services,它們本質上是異步的。但問題並不在於這項技術的選擇。我想打包一個異步調用,例如對於Web服務,並提供我自己的簡化和鬆散耦合的API(例如:通過DomainClient的存儲庫)。異步API回調設計問題

到目前爲止,我的異步方法下面的風格在我的接口:

public void DoAsyncWork(Action<AsyncWorkResult<someResultType>> callback); 

和我正在考慮加入以下重載:

public void DoAsyncWork(Action<someResultType> onSuccess, 
         Action<Exception> onException); 

public void DoAsyncWork(Action<someResultType> onSuccess, 
         Action<Exception> onException, 
         Action finally); 

onSuccess動作只有在異步調用完成成功時纔會執行y,onException在遇到由呼叫報告的錯誤的情況下執行,並且在任一情況下在最後執行finally

我的問題是,在實施了第一種類型的「一般」和最常用的(據我所知)的情況下,我是否應該實施其他兩種?他們在開發和維護方面值得投入嗎?

這個問題是關於設計方面,獨立於任何要求。

感謝提前:)

+0

@Cory:我沒有故意添加「Silverlight」標籤,因爲正如我所說的,我只關注API設計方面。無論如何感謝:) – AbdouMoumen

+0

根據您使用的語言/框架,最好的API設計可能看起來截然不同。我會說這是重要的信息,但也許不是。 –

+0

@Cory:好,夠公平:) 但是你的答案在哪裏呢?我沒有使用你提到的那種模式,我會更多地瞭解它。然後我發現你的答案已經消失:s – AbdouMoumen

回答

0

我會說,如果可能的話,保持一個真正的好,一致的API。

這可能是最好的模擬異步的API已經在.NET中存在,這使您可以使用內置的異常處理語法:

public IAsyncResult BeginAsyncWork(AsyncCallback callback, object state); 
public SomeResultType EndAsyncWork(IAsyncResult res); 

這是用這樣的:

BeginAsyncWork(res => 
{ 
    // BeginAsyncWork calls this once it completes, even on error. 

    // res is IAsyncResult -- the same one BeginAsyncWork returns. 
    // res.AsyncState is whatever the users passed in the 'state' parameter. 

    try 
    { 
     // To get the result, and possibly an exception, EndAsyncWork is called. 
     SomeResultType r = EndAsyncWork(res); 
    } 
    catch(Exception ex) 
    { 
     // EndAsyncWork throws the exception. 
    } 
    finally 
    { 
     // 
    } 
}, null);