【问题标题】:View Models in ASP.NET MVC that are similar to the Model classes在 ASP.NET MVC 中查看与模型类相似的模型
【发布时间】:2010-09-03 18:12:14
【问题描述】:

您如何处理基于 SQL 表的模型类的情况,例如当使用实体框架为您生成实体和数据访问时,但您仍然希望一两个属性不同和/或排除。

拥有单独的 View Model 类和 Model 类我没有问题,但越来越多的情况下差异很小。所以我最终将模型类属性复制到视图模型类并更改/删除我想要的属性。

因此,从某种意义上说,我想遵循单独的模型和视图模型类的模式,但是仅仅实现视图和模型之间的依赖关系的消除通常很耗时——我可以只在视图中使用模型类。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我从不在 POST 操作中使用域模型(以累积用户输入)——嗯,除非通过实体 ID 绑定到 db。但我有时确实会将它们传递给视图。这实际上很糟糕——你看不到视图真正需要什么,并且你经常开始在视图内创建业务逻辑查询——但是当这变得有点糟糕时(例如,视图需要以某种方式转换域模型以查询/过滤数据),添加视图模型并将其更改为适当的实现相当容易。从某种意义上说,这充其量就是 KISS/YAGNI - 如果它有效并且没有缺点,为什么不呢?将其更改为更复杂的东西,只有在需要它的情况下才开始。

    【讨论】:

      【解决方案2】:

      您可以简单地将 ViewModel 设为 Model 的子类。根据需要,您可以重构您的 ViewModel,甚至从您的模型中删除它的继承。

      您可以预见将域模型传递给您的视图的潜在缺点是正确的,但如果它适合您,则没有规则反对保持简单。

      【讨论】:

      • 子类化实际上是有意义的。我可以拥有单独的文件/类,并且仍然使用 EF 中已经存在的实现。当我将来需要它时,我可以删除继承并以另一种方式实现它。
      【解决方案3】:

      您还可以选择将视图模型创建为模型的简单属性副本,然后依靠 Automapper 之类的东西来处理映射。一般来说,我更喜欢将我的域模型保存在一个单独的程序集中——继承会起作用,我还没有尝试过。跨越这个程序集边界拉一个继承层次结构似乎有点多。如果您的视图模型与您的领域模型相同,或者足够相似以至于您可以在 UI 层中使用您的领域模型,那么自动映射器甚至派生或创建模型的副本可能是多余的。

      【讨论】:

        猜你喜欢
        • 2022-01-05
        • 2013-03-30
        • 2010-10-30
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        • 2011-07-22
        • 2016-12-14
        • 1970-01-01
        相关资源
        最近更新 更多