2011-08-01 23 views
0

私は、本質的に非同期のRIAサービスでSilverlightを使用しています。しかし、この技術の選択には問題はありません。非同期APIコールバック設計の質問

たとえば、Webサービスのために非同期呼び出しをラップし、私自身の単純化された緩やかに結合されたAPI(例:DomainClient上のリポジトリ)を提供したいと思います。

これまでのところ、私は私のインタフェースで非同期メソッドの次のスタイルがあります。

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が実行されます。

私の質問は、「一般的なもの」のような最初のスタイルを実装し、他の2つを実装する必要があります(私が知る限り)。彼らは開発とメンテナンスに投資する価値がありますか?

この質問は、要件とは関係なくデザイン面に関するものです。事前に

感謝:)

+0

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

のように使用されています@コーリー:ここでは、「Silverlight」タグをここに追加しませんでした。なぜなら、私はAPI設計の面だけに焦点を当てているからです。とにかくありがとう:) – AbdouMoumen

+0

最高のAPIデザインは、使用している言語/フレームワークによって大きく違って見える場合があります。重要な情報だとは思いますが、そうでないかもしれません。 –

+0

@Cory:OK、フェア十分:) あなたの答えはどこに行きましたか?私はあまり言及したパターンを使用しませんでした、そして、私はそれについてもっと学ぶつもりでした。あなたの答えがなくなったことがわかりました: – AbdouMoumen

答えて

0

私は、可能な場合は、1つは本当に良い、一貫性のあるAPIにそれを維持すると思います。

それはあなたが組み込みの例外処理の構文を使用することができ、すでに.NETに存在して非同期APIを、模倣することはおそらく最善です:

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);