【发布时间】:2014-09-07 01:15:21
【问题描述】:
我现在对一般的视图模型设计概念有一个很大的困境。我的意思是一般的,就像它不完全绑定到给定的语言或环境一样:当我为 Winforms、WPF 或 KnockoutJS 编写视图模型时,我遇到了同样的困境。
作为一个简化的用例,假设我有一个视图,我必须从两个选择框中选择一个国家和一个城市。两者都在数据库中以唯一 ID、名称和其他一些相关信息(例如 - 比如说 - 人口)表示。现在想象一下,我必须在例如视图的标题中呈现当前所选数据的文本形式,例如“您已选择英国伦敦”。现在这是我创建视图模型的两个替代方案,我将尝试列举我已经在每个版本下面考虑的优点/反面。代码以伪方式编写,尽可能通用。
class RegionModel {
ID: number;
Name: string;
Population: number;
}
版本 1:存储所选对象。
class MainView {
SelectedCountry: RegionModel;
SelectedCity: RegionModel;
SelectionInfo: string; // computed, should return the "You've selected ...." caption
Countries: List<RegionModel>; // datasource for country select
Cities: List<RegionModel> // datasource for city select
}
优点:
- 由于所选内容简单明了且易于理解 项目的类型与可选项目的类型相同。
- 很容易计算诸如“您已选择...”之类的信息,因为所有 当前选定项目的成员直接存在。
缺点:
- 它拥有比消费者 API 通常需要的更多信息。通常 它只需要 ID。
- 如果在客户端应用程序中使用,则整个选定对象将是 返回到服务器,占用带宽。
- 如果消费者 API 只需要 ID(在大多数情况下),我必须 在我通过之前解决某种转换。在网络应用程序中可能 例如,在序列化为 JSON 期间。
版本 2:仅存储所选项目的 ID
class MainView {
SelectedCountryID: number;
SelectedCityID: number;
SelectionInfo: string; // computed, should return the "You've selected ...." caption
Countries: List<RegionModel>; // datasource for country select
Cities: List<RegionModel> // datasource for city select
}
优点:
- 它的高效之处在于它只包含以下信息 很可能是消费者 API 需要的。
- 无需额外转换,高效能通过 几乎“原样”到服务器端或其他 API。
缺点:
- 不是那么简单易读(在我看来)。
- 计算信息字符串怎么样?现在更难了,我需要 从选择源列表中获取所需的成员 通过给定的 ID 进行搜索,因此它在很大程度上取决于 那些列表(我的意思是该项目必须存在于那里)。
我希望它不会因为没有建设性而很快关闭。任何形式的建议、想法或经验将不胜感激。另外,如果答案是“视情况而定”,请尝试在何时何地使用哪个。
更新
我认为我的问题有点不清楚。我知道从数据库实体中解耦视图模型,这里我从来没有提到数据库实体。我提到了一个“抽象消费者 API”。在一个具体的场景中:如果 API 需要所选项目的名称,而我的 API 只需要 ID,我应该选择哪个替代方案,应该在哪里进行转换?
例如,我的服务器需要这样的数据格式 (JSON):
{
"SelectedCountryID": 2,
"SelectedCityID": 5
}
没有别的。我怎么能优雅地处理它?我想通过手动转换来避免重复自己。
【问题讨论】:
标签: c# wpf mvvm knockout.js viewmodel