我可能在这里误解了一些关于ViewModel的东西(我是他们的新手),但是传递静态Get
方法和IQueryable
是不好的做法?我没试过这个,所以我不确定它是否会起作用,但这是一个关于ViewModels用法的更大问题。
例如:
using (var db = something.Invoke()) {
var query = some query;
var data = MyViewModel.Get(query); //pass an IQueryable
//do something with data
}
class MyViewModel {
public List<int> Something {get; set;}
public static MyViewModel Get(IQueryable data) {
var view = new MyViewModel();
var list = new List<int>();
foreach (var d in data) {
list.Add(d.Column);
}
view.Something = list;
return view;
}
}
将数据库映射到更通用的数据结构然后将其传递给我的ViewModel以进行另一个映射(如数据库 - &gt; List - &gt; ViewModel)似乎真的是多余的。如果我可以传递我的查询并且在ViewModel中进行100%的映射,而不是在中间步骤(数据库 - &gt; ViewModel)中,那将会更容易。
答案 0 :(得分:4)
我们尝试在ViewModels中使用逻辑,但这是一条疯狂之路。
ViewModels应该是POCO - 只有没有(或非常基本)逻辑的属性。所有映射都应该在控制器中完成,甚至可以在控制器调用的QueryHanlder
中完成。并且QueryHanlder
将依赖于DB并且需要映射以从DB数据结构获取到ViewModel。
ViewModel的职责是将数据从控制器传送到视图(或向后)。如果你得到DB或映射逻辑,这违反了单一责任原则。
答案 1 :(得分:1)
我更喜欢让我的ViewModel相当干净,并且不依赖于它们的构造方式。
在这种情况下,我会使用构建器或工厂模式来构建ViewModel,然后该构建器/工厂可以依赖于您的数据库。