c# - 将逻辑放入 ViewModel get'ers

标签 c# asp.net-mvc model-view-controller

您如何看待将 Get 逻辑放入 ViewModel 的 getter 中?像这样的东西:

public class DummyViewModel
{
    public int Id { get; set; }

    private DummyObject myObject;

    public DummyObject MyObject
    {
        get
        {
            if (MyObject == null)
            {
                DummyRepository repo = new DummyRepository();
                myObject = repo.Get(Id);
            }
            return myObject;
        }
    }

}

这是不好的做法,还是完全没问题?我发现我的 Controller 通过在那里执行所有的 get-logic 变得非常臃肿,但我真的很纠结我应该把它放在哪里......

我这样做的原因是,我可以将 ViewModel 传递给不同类型的 View ,并且只会根据请求的属性执行必要的数据库查找。

最佳答案

将逻辑放在 VM 的 getter 中没有错 - VM 的作用是将数据呈现给 View ,并且它应该尽可能地准备好“查看”(View 不应该也必须这样做)很多(如果有的话)工作在显示数据之前塑造数据)。

例如,我在我的 VM 中使用名为 GetAvailableClients 的属性,这将是 View 绑定(bind)到的属性之一。该特定 getter 的工作是过滤数据——IOW 提供从完整列表(也保存在 VM 中)中选择的一组精简数据,这些数据通常会使用 LINQ 进行过滤,这意味着我已经放置了一些自定义逻辑在 setter/getter 中。

不过,我不喜欢您的其余方法,如果属性尚未填充,它就会转到存储库并获取数据本身。对我来说这是一个禁忌,该属性完全违反了 single responsibility 的原则。让属性(property)承担太多责任。更不用说,一旦您开始将该属性绑定(bind)到 UI,这就不是一个好的做法——当用户执行某个操作时,您的应用突然会开始挂起,因为您的属性 getter 已被触发,并且它已决定调用数据库或 Web 服务,更糟糕的是,在 UI 线程上进行了调用……它变得丑陋了。

关于c# - 将逻辑放入 ViewModel get'ers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2712394/

相关文章:

ruby-on-rails - ActionController::估值中的UrlGenerationError#new

c# - Automapper Intellisense 在 VS2015 中不起作用

c# -\015 &\012 和\r &\n 的区别

c# - 绘制光标时出现通用 GDI+ 异常 ~3322 次

c# - jQuery 发布到 Controller 并重定向到 ASP.NET MVC View

java - 在 Java 中使用 swing 实现猜词游戏需要帮助吗?

c# - 如何在 Fluent 验证中根据字符串列表验证字符串?

c# - 使用枚举和 Entity Framework 脚手架从模型创建下拉列表?

jquery - 从 FileReader.result 检索文件对象以作为 ajax 数据发送到服务器

java - 转换模型的最佳方法