首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步访问的数据接口

异步访问的数据接口
EN

Stack Overflow用户
提问于 2013-05-16 09:49:34
回答 3查看 735关注 0票数 3

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

代码语言:javascript
复制
    public interface IUserDao
    {
      User GetUser(int userId);
    }

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

代码语言:javascript
复制
    public void UserSelected(int userId)
    {
       User user = daoFactory.UserDao.GetUser(userId);

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

在这种情况下,数据访问需要异步完成。如果异步调用的需求一直持续到数据接口,我就不太明白了。

例如:

代码语言:javascript
复制
    public interface IUserDao
    {
      void GetUserBegin(int userId);
      User GetUserEnd();
    }

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

编辑:

我认为我的简单例子会有所帮助,但实际上可能会造成一些混乱。我使用RestSharp来获取我需要的数据,这很好地处理了异步部分。我无法解决的是,如何在这批产品周围包装一个接口,这样我就可以在测试期间将它换掉。

代码语言:javascript
复制
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);
    }
}
EN

回答 3

Stack Overflow用户

发布于 2013-05-16 09:57:10

如果您使用的是最新版本的.NET,可以利用async - await

代码语言:javascript
复制
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>

如果您使用的是.NET 4.0版本,则可以使用Task从高级方法调用UserSelected

代码语言:javascript
复制
Task.Factory.StartNew(() => UserSelected(userId));
票数 4
EN

Stack Overflow用户

发布于 2013-05-16 09:57:28

如果您使用等待模式,则只需执行

代码语言:javascript
复制
public interface IUserDao
{
  Task<User> GetUser(int userId);
}

把它叫做

代码语言:javascript
复制
 User user = await daoFactory.UserDao.GetUser(userId); 

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

票数 4
EN

Stack Overflow用户

发布于 2013-05-16 10:14:15

.Net有三种异步操作模式:

  • 异步编程模型(APM)
  • 基于事件的异步模式
  • 基于任务的异步模式(TAP)

就你的情况而言,我更喜欢任务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16584164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档