2011-08-01 68 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);