MvvmCross REST服务体系结构
我有一个类似于github上mvvmcross教程实现的场景。我有这个BaseViewModelMvvmCross REST服务体系结构,rest,service,architecture,mvvmcross,crud,Rest,Service,Architecture,Mvvmcross,Crud,我有一个类似于github上mvvmcross教程实现的场景。我有这个BaseViewModel 公共类BaseViewModel:MvxViewModel { 受保护的void GeneralSyncLoad(字符串url、操作响应StreamHandler) { var request=WebRequest.Create(url); request.BeginGetResponse((结果)=>GeneralProcessResponse(请求、结果、响应StreamHandler),nul
公共类BaseViewModel:MvxViewModel
{
受保护的void GeneralSyncLoad(字符串url、操作响应StreamHandler)
{
var request=WebRequest.Create(url);
request.BeginGetResponse((结果)=>GeneralProcessResponse(请求、结果、响应StreamHandler),null);
}
受保护的void GeneralRequestSendObjectAsync(IAsyncResult asynchronousResult、T objectToSend、Action responseStreamHandler)
{
var request=(HttpWebRequest)asynchronousResult.asynchState;
使用(var requestStream=request.EndGetRequestStream(asynchronousResult))
{
var serializer=newdatacontractjsonserializer(typeof(T));
var stream=newmemoryStream();
serializer.WriteObject(流,objectToSend);
Write(stream.ToArray(),0,stream.ToArray().Length);
}
BeginGetResponse(结果=>GeneralProcessResponse(请求、结果、响应StreamHandler)、请求);
}
私有void GeneralProcessResponse(WebRequest请求、IAsyncResult结果、Action responseStreamHandler)
{
var response=request.EndGetResponse(结果);
使用(var stream=response.GetResponseStream())
{
responseStreamHandler(流);
}
}
}
此类用于继承。继承的类使用此模式调用rest服务。例如TestListViewModel
公共类TestListViewModel:BaseViewModel
{
/*这里有一些代码*/
公共TestListViewModel()
{
异步加载();
}
私有void异步加载()
{
GeneralAsyncLoad(URL\u TESTLIST,ProcessResponse);
}
私有void ProcessResponse(流)
{
var jsonSerializer=新数据契约jsonSerializer(typeof(List));
var tlist=(列表)jsonSerializer.ReadObject(流);
List=tlist;
}
公共MvxCommand delete命令
{
获取{returnnewmvxcommand(dodelite,i=>i>0);}
}
专用异步void DoDelete(int-asTestID)
{
var request=WebRequest.Create(URL\u TESTDELETE);
request.Method=“DELETE”;
var asyncResult=request.BeginGetResponse(null,null);
EndGetResponse(异步结果);
异步加载();
}
}
这一切都很好,但我并不满意。在mvvmcross中使用REST服务有更好的解决方案吗?最近我读了一篇关于mvvmcross插件(网络插件)的文章,但我没有在网上找到任何例子。
是否有任何nugget软件包需要下载,或者我是否应该编写自己的IMvxRestClient和IMvxJsonRestClient实现?
最后,我的目的是将数据访问功能与实现分离。wiki中有一些插件示例——或者更多的库现在支持PCL,例如HttpClient、Json.Net、RestSharp、,etc@Stuart,我偷看了N-06的代码,并从SimpleRestService扩展了代码。我在维基上读了插件文章,但找不到一个实现网络的具体例子。
public class BaseViewModel : MvxViewModel
{
protected void GeneralAsyncLoad(string url, Action<Stream> responseStreamHandler)
{
var request = WebRequest.Create(url);
request.BeginGetResponse((result) => GeneralProcessResponse(request, result, responseStreamHandler), null);
}
protected void GeneralRequestSendObjectAsync<T>(IAsyncResult asynchronousResult, T objectToSend, Action<Stream> responseStreamHandler)
{
var request = (HttpWebRequest)asynchronousResult.AsyncState;
using (var requestStream = request.EndGetRequestStream(asynchronousResult))
{
var serializer = new DataContractJsonSerializer(typeof(T));
var stream = new MemoryStream();
serializer.WriteObject(stream, objectToSend);
requestStream.Write(stream.ToArray(), 0, stream.ToArray().Length);
}
request.BeginGetResponse(result => GeneralProcessResponse(request, result, responseStreamHandler), request);
}
private void GeneralProcessResponse(WebRequest request, IAsyncResult result, Action<Stream> responseStreamHandler)
{
var response = request.EndGetResponse(result);
using (var stream = response.GetResponseStream())
{
responseStreamHandler(stream);
}
}
}
public class TestListViewModel : BaseViewModel
{
/* Some code here */
public TestListViewModel()
{
AsyncLoad();
}
private void AsyncLoad()
{
GeneralAsyncLoad(URL_TESTLIST, ProcessResponse);
}
private void ProcessResponse(Stream stream)
{
var jsonSerializer = new DataContractJsonSerializer(typeof(List<TestDataViewModel>));
var tlist = (List<TestDataViewModel>)jsonSerializer.ReadObject(stream);
List = tlist;
}
public MvxCommand<int> DeleteCommand
{
get { return new MvxCommand<int>(DoDelete, i => i > 0); }
}
private async void DoDelete(int asTestID)
{
var request = WebRequest.Create(URL_TESTDELETE);
request.Method = "DELETE";
var asyncResult = request.BeginGetResponse(null, null);
request.EndGetResponse(asyncResult);
AsyncLoad();
}
}