代码之家  ›  专栏  ›  技术社区  ›  Yngve B-Nilsen

将逻辑放入viewmodel get'ers

  •  3
  • Yngve B-Nilsen  · 技术社区  · 15 年前

    把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;
            }
        }
    
    }
    

    这是不好的做法,还是完全好?我发现我的控制器在那里做所有的get逻辑变得非常臃肿,但我真的很苦恼,我应该把它放在哪里…

    我这样做的原因是,我可以将viewmodel传递给不同类型的视图,并且只根据请求的属性执行必要的db查找。

    3 回复  |  直到 15 年前
        1
  •  10
  •   slugster Joey Cai    12 年前

    把逻辑放在vms的getter中并没有错——vm的角色是向视图显示数据,并且它应该尽可能准备好“查看”(视图不应该在显示数据之前做太多(如果有的话)工作来塑造数据)。

    例如,我使用名为 GetAvailableClients 在我的vm中,这将是视图绑定到的属性之一。这个特定getter的工作是过滤数据-iow显示从一个完整的列表(也保存在vm中)中选择的一组缩减的数据,该数据通常使用linq过滤,这意味着我在getter中放置了一些自定义逻辑。

    不过,我不喜欢的是您的方法的其余部分,如果属性没有被填充,那么它会转到存储库并获取数据本身。对我来说,这是一个“不”字,财产完全违反了 single responsibility 让财产承担太多的责任。更不用说,这不是一个好的实践,一旦你开始绑定该属性到用户界面-突然你的应用将开始挂起当用户执行一个操作时,因为你的属性getter已经被触发,它已经决定调用数据库或webservice,并使更糟糕的是,调用是在ui线程上完成的……只是变得很难看。

        2
  •  2
  •   UpTheCreek    15 年前

    就我个人而言,我的视图模型中没有包含任何逻辑——它们是相当愚蠢的DTO。我当然不会让vm通过存储库来负责自己的加载。

        3
  •  2
  •   BenMorel Manish Pradhan    11 年前

    你的问题很笼统,但我会尽我所能回答。

    我不喜欢这些东西:

    1)可测试性。您的属性正在创建存储库,您将如何模拟存储库并测试它?

    2)延迟加载。延迟加载可能会影响性能,ViewModel不应该这样做。如果将viewmodel绑定到包含数百个条目的网格,会发生什么情况?

    3)公开ID。您的ID属性(我假设它是实体的主键值)有一个setter。你要在视图中显示这个id吗?如果不是,就把它扔掉,如果是的话,就把setter移走。setter意味着视图必须执行某种biz功能来查找正确的值,这会破坏soc。

    推荐文章