将IQueryable传递给ViewModel的不良做法

时间:2014-01-20 23:56:34

标签: c# asp.net-mvc

我可能在这里误解了一些关于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)中,那将会更容易。

2 个答案:

答案 0 :(得分:4)

我们尝试在ViewModels中使用逻辑,但这是一条疯狂之路。

ViewModels应该是POCO - 只有没有(或非常基本)逻辑的属性。所有映射都应该在控制器中完成,甚至可以在控制器调用的QueryHanlder中完成。并且QueryHanlder将依赖于DB并且需要映射以从DB数据结构获取到ViewModel。

ViewModel的职责是将数据从控制器传送到视图(或向后)。如果你得到DB或映射逻辑,这违反了单一责任原则。

答案 1 :(得分:1)

我更喜欢让我的ViewModel相当干净,并且不依赖于它们的构造方式。

在这种情况下,我会使用构建器或工厂模式来构建ViewModel,然后该构建器/工厂可以依赖于您的数据库。