Ich habe eine SL4-Anwendung, die das MVVM Light Toolkit verwendet. Innerhalb eines View-Modells rufe ich einen Datendienst auf, der Daten von einem OData-Dienst abruft. Innerhalb der VM verwende ich die DispatcherHelper-Dienstprogrammklasse (Teil von MVVM Light), um die Eigenschaft auf der VM aus den Daten im Rückruf zu aktualisieren, den ich an den Datendienst weitergebe. Meine View Model-Methode sieht zum Beispiel wie folgt aus:
public string CurrentUserLogin {
get {
if (string.IsNullOrEmpty(_currentUserLogin))
RetrieveCurrentUserLogin();
return string.IsNullOrEmpty(_currentUserLogin) ? _currentUserLogin : _currentUserLogin.Replace(@"\\", @"\");
}
set {
if (_currentUserLogin != value) {
_currentUserLogin = value;
RaisePropertyChanged(CurrentUserLoginPropertyName);
}
}
}
private void RetrieveCurrentUserLogin() {
DataService.GetCurrentUserLogin(result => {
DispatcherHelper.UIDispatcher.BeginInvoke(() => {
CurrentUserLogin = result;
});
});
}
Und so sieht mein Datendienst aus:
public void GetCurrentUserLogin(Action<string> callback) {
// create query request
var query = OnDemandContext.CreateQuery<string>("GetCurrentUserLogin");
var request = (HttpWebRequest)WebRequest.Create(query.RequestUri);
request.BeginGetResponse(asyncResult => {
var responseStream = request.EndGetResponse(asyncResult).GetResponseStream();
var responseDocument = XDocument.Load(responseStream);
callback(responseDocument.Root.Value);
}, null);
}
Wenn ich meine SL-Anwendung ausführe, funktioniert alles bestens. Allerdings ist das Problem, das ich habe, wenn ich versuche, Unit-Tests gegen sie mit dem SL Unit Testing Framework zu schreiben. Ich kann meine Datendienst ohne ein Problem zu testen, aber es scheint, dass der DispatcherHelper einen Schraubenschlüssel in alle meine Tests als DispatcherHelper.UIDispatcher ist immer null, wenn gefeuert wirft. Ich nehme an, es hat etwas mit der Initialisierung zu tun (die in meinem SL app Application_Startup() ist). Ich habe versucht, es in meiner Testanwendung zu initialisieren, aber das hilft nicht. Ich habe auch versucht, mit DispatcherHelper.CheckBeginInvokeOnUI(), aber das hat keine Wirkung auf das Problem.
Ideen?