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