我可能对这里的 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 以执行另一个映射(如数据库 -> 列表 -> ViewModel)似乎真的是多余的。如果我可以只传递我的查询并让 100% 的映射发生在 ViewModel 中,而不是在中间步骤(数据库 -> ViewModel)中进行,那就更容易了。
最佳答案
我们曾尝试在 ViewModel 中使用逻辑,但这是一条疯狂的道路。
ViewModels 应该是 POCO——只有没有(或非常基本的)逻辑的属性。所有映射都应在 Controller 中完成,甚至在 Controller 调用的 QueryHanlder
中完成。 QueryHanlder
将依赖于 DB 并进行必要的映射以从 DB 数据结构获取 ViewModel。
ViewModel 的职责是将数据从 Controller 传输到 View (或向后)。并且如果你将 DB 或映射逻辑放入其中,这将违反单一职责原则。
关于c# - 将 IQueryable 传递给 ViewModel 的错误做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21246583/