(怖いコードについての提案が必要)
対応する Web サービス ハンドラーを呼び出すために、すべてのビュー モデルに MVVM と一般化された DataService クラスを組み込むことで、古い Windows Phone アプリ コードに優雅さをもたらそうとしています。
たとえば、通知 ViewModel には次のようなものがあります。
private ObservableCollection<Notification> _notifications;
public ObservableCollection<Notification> Notifications
{
get
{
return _notifications;
}
}
public void GetNotifications()
{
new DataService().DownloadViewModelData<ObservableCollection<Notification>>(GetNotificationsCallback, "getnotificationslist.ashx");
this.IsDataLoaded = true;
}
public void GetNotificationsCallback(ObservableCollection<Notification> notificationsList)
{
_notifications = notificationsList;
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
NotifyPropertyChanged("Notifications");
});
this.IsDataLoaded = true;
}
DataService クラスでは、サービスと通信するためのジェネリック メソッドを作成しようとしています。
public static string ServerUrl = "http://<ip-address>:<port>/";
public void DownloadViewModelData<T>(Action<T> callbackFunction, string handlerName, bool methodIsPOST = false, List<KeyValuePair<string, string>> querySet = null) where T : class
{
var queryString = "";
if(null != querySet)
{
foreach (KeyValuePair<string, string> tuple in querySet)
{
queryString += tuple.Key + "=" + tuple.Value + "&";
}
queryString = queryString.Remove(queryString.Length - 1, 1);
}
var urlQueryString = ServerUrl + handlerName;
if (!methodIsPOST)
urlQueryString += queryString;
var webRequest = HttpWebRequest.CreateHttp(urlQueryString);
webRequest.ContentType = "application/x-www-form-urlencoded";
Func<AsyncCallback, object, IAsyncResult> requestingMethod = null;
if (methodIsPOST)
{
webRequest.Method = "POST";
webRequest.ContentLength = queryString.Length;
webRequest.BeginGetRequestStream(
a =>
{
System.IO.Stream postStream = webRequest.EndGetRequestStream(a);
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(queryString);
postStream.Write(byteArray, 0, queryString.Length);
postStream.Close();
webRequest.BeginGetResponse(
b =>
{
using (WebResponse response = webRequest.EndGetResponse(b))
{
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
callbackFunction(new DataContractJsonSerializer(typeof(T)).ReadObject(response.GetResponseStream()) as T);
}
}
},
null
);
},
null
);
}
else
{
webRequest.Method = "GET";
webRequest.BeginGetResponse(
a =>
{
using (WebResponse response = webRequest.EndGetResponse(a))
{
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
callbackFunction(new DataContractJsonSerializer(typeof(T)).ReadObject(response.GetResponseStream()) as T);
}
}
},
null
);
}
}
質問:
ラムダ式を使用する正しい (最新の) 方法と、MVVM のデータ層を処理するための全体的な正しいアプローチですか (プロジェクトに複数のモデル、ビュー、およびビューモデルがある場合)?
Portable Class Library (PCL)で Web サービスを呼び出すために、このアプローチをお勧めしますか?