2013-05-16 91 views
1

我的任何数据访问的标准布局涉及一个很好的简单接口。异步访问的数据接口

public interface IUserDao 
    { 
     User GetUser(int userId); 
    } 

然后我可以切换到不同的数据层实现进行单元测试。一个标准的用法是从MVP中的一个演示者那里做一些简单的事情,比如将数据推入视图。

public void UserSelected(int userId) 
    { 
     User user = daoFactory.UserDao.GetUser(userId); 

     view.FirstName = user.FirstName; 
     view.LastName = user.LastName; 
    } 

在这种情况下,数据访问需要异步完成。如果异步调用的需求应该降低到数据接口的程度,那么我无法理解我的头脑。

例如

public interface IUserDao 
    { 
     void GetUserBegin(int userId); 
     User GetUserEnd(); 
    } 

我需要改变接口还是需要异步访问只是调用代码中实现的一部分?

编辑:

我想我的简单的例子就是帮助,但它实际上可能会造成一些混乱。我正在使用RestSharp获取我需要的数据,并很好地处理了我的异步部分。我无法解决的问题是如何在这个区域中包装一个界面,以便在测试过程中将其切换出来。

public UserDao : IUserDao 
{ 
    public void GetUser(int userId) 
    {   
     var request = new RestRequest("User/GetUser/{id}", Method.POST); 

     // replaces matching token in request.Resource 
     request.AddUrlSegment("id", id.ToString()); 

     //Create the client 
     var client = AuthenticatedRestClient(); 

     //Execute 
     client.ExecuteAsync(request, response => 
     { 
      ProcessUser(response); 
     }); 
    }   

    public static void ProcessUser(IRestResponse response) 
    { 
     //Extract the user from the reponse 
     User user = (User)ProcessResponse<User>(response); 
    } 
} 

回答

4

如果你在.NET的最新版本,你可以采取的async - await优势:

public interface IUserDao 
{ 
    Task<User> GetUser(int userId); 
} 

public async Task UserSelected(int userId) 
{ 
    User user = await daoFactory.UserDao.GetUser(userId); 

    view.FirstName = user.FirstName; 
    view.LastName = user.LastName; 
} 

请注意GetUser实施应返回Task<User>。如果您使用的等待模式,你可以

Task.Factory.StartNew(() => UserSelected(userId)); 
+0

非常感谢。如果我没有使用.Net的最新版本,我会如何处理这个问题。我正在使用Xamarin进行项目工作,iOS和Android的异步仅在预览中。 http://blog.xamarin.com/brave-new-async-mobile-world/ – fluent

+0

@fluent:试试我编辑的答案。我没有碰过单声道btw –

4

只是做

public interface IUserDao 
{ 
    Task<User> GetUser(int userId); 
} 

和:

如果您在版本.NET 4.0,你可以使用Task调用UserSelected从上法叫它

User user = await daoFactory.UserDao.GetUser(userId); 

它很好,因为它通知你的应用程序这个方法被称为异步调用层。