我正在寻找以下设置的最佳实践.
View是绑定到ViewModel的数据(通过WPF).ViewModel通过INotifyPropertyChanged更新视图.模型通过事件更新ViewModel.模型知道来自外部世界的东西,比如如何通过WebClient从互联网上获取东西,以及如何从数据库中检索数据.
获取和发送外部世界的东西应该异步完成,以便UI(以及扩展,用户)不会在外面世界等待.
最好的做法是什么?
1. ViewModel应负责异步调用模型方法.
这将具有能够写出类似的东西的优点
GetWebPage(string url) {
var result = await Model.GetWebPageAsync(url);
Url = result.Url;
}
Run Code Online (Sandbox Code Playgroud)
在ViewModel中,Url使用INotifyPropertyChanged更新View的ViewModel属性.甚至
GetWebPage(string url) {
var result = await Model.GetWebPageAsync(url);
_view.Url = result.Url;
}
Run Code Online (Sandbox Code Playgroud)
在哪里我们可以一起避免INotifyPropertyChanged.您更喜欢以下哪种方式?
但是,让Model本身进行异步工作可能更为明智.我们可能希望能够在没有View和ViewModel的情况下使用Model,同时仍然可以异步工作.另一个论点是,谁更清楚模型什么东西最好是异步处理.
2. Model自己处理所有异步内容.ViewModel代码变得更像
GetWebPage(string url) {
Model.GetWebPage(url);
}
Run Code Online (Sandbox Code Playgroud)
在模型中
GetWebPage(string url) {
var result = await Model.GetWebPageAsync(url);
if (UrlChanged != null);
UrlChanged(this, new UrlChangedEventArgs(url));
}
Run Code Online (Sandbox Code Playgroud)
ViewModel可以订阅,并相应地更新View.
您认为哪种方式是最佳做法?
第三种方式:视图模型进行异步调用,但它使用客户端服务来检索网页,模型本身是贫乏的(它对外部世界一无所知):
GetWebPage(string url)
{
var dataService = anyServiceLocator.GetService<IDataService>();
var result = await dataService.GetWebPageAsync(url, Model);
Url = result.Url;
}
Run Code Online (Sandbox Code Playgroud)
这允许改变实际数据下载算法,例如用于测试目的。
| 归档时间: |
|
| 查看次数: |
762 次 |
| 最近记录: |