Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步访问的数据接口_C#_Asynchronous - Fatal编程技术网

C# 异步访问的数据接口

C# 异步访问的数据接口,c#,asynchronous,C#,Asynchronous,我的任何数据访问的标准布局都包含一个漂亮的简单界面 public interface IUserDao { User GetUser(int userId); } 然后,我可以切换到不同的数据层实现中进行单元测试。标准用法是MVP中的演示者执行一些简单的操作,如将数据推入视图 public void UserSelected(int userId) { User user = daoFactory.UserDao.GetUser

我的任何数据访问的标准布局都包含一个漂亮的简单界面

    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
    {
      User GetUser(int userId);
    }
e、 g

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

编辑:

我认为我的简单示例会有所帮助,但实际上可能会引起一些混乱。我正在使用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);
    }
}
public UserDao:IUserDao
{
public void GetUser(int userId)
{           
var request=new RestRequest(“User/GetUser/{id}”,Method.POST);
//替换请求中的匹配令牌。资源
request.AddUrlSegment(“id”,id.ToString());
//创建客户端
var client=AuthenticatedRestClient();
//执行
client.ExecuteAsync(请求、响应=>
{
ProcessUser(响应);
});
}        
公共静态void ProcessUser(iRestreponse响应)
{
//从响应中提取用户
用户用户=(用户)进程响应(响应);
}
}

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


如果您使用的是等待模式,那么您可以这样做

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

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

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


对于您的情况,我更喜欢这个任务。

非常感谢。如果我没有使用最新版本的.Net,我将如何处理这个问题。我正在做一个使用Xamarin和async for iOS的项目,Android只是在预览中。
Task.Factory.StartNew(() => UserSelected(userId));
public interface IUserDao
{
  Task<User> GetUser(int userId);
}
 User user = await daoFactory.UserDao.GetUser(userId);