【问题标题】:Model and partial model, how to avoid the redundant code?模型和部分模型,如何避免冗余代码?
【发布时间】:2012-11-17 19:29:45
【问题描述】:

我有一个模型和一个部分模型,其中仅包含我需要在 JSON 中公开的属性。

但是模型和他的部分模型之间的属性是多余的。

我怎样才能避免这种情况或改进我的方法?

namespace Dashboard.Models.UserModels
{
    public class UserModel
    {
        public int id { get; set; }
        public string dbName { get; set; }
        public string firstname { get; set; }
        public string lastname { get; set; }
        public int idExternal { get; set; }
        public int idInstance { get; set; }
        public string login { get; set; }
        public string password { get; set; }
        public DateTime? dtContractStart { get; set; }
        public DateTime? dtContractEnd { get; set; }
        public string emailPro { get; set; }
        public string emailPerso { get; set; }

        public LuccaUserModel()
        {
            idInstance = -1;
        }

        // partial model for json result
        // not sure is the best way or have to be here
        public class PartialUserModel
        {
            public int id { get; set; }
            public string firstname { get; set; }
            public string lastname { get; set; }
            public string emailPro { get; set; }
            public string emailPerso { get; set; }
            public DateTime? dtContractStart { get; set; }
            public DateTime? dtContractEnd { get; set; }
            public string url { get; set; }
        }

        // UserModel Methods
    }
}

【问题讨论】:

  • 这不是[JsonIgnore] 的用途吗?
  • @paul : Darin Dimitrov 建议避免使用它 (source) 所以我不知道。 :s

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


【解决方案1】:

在进行适当的设计和构建过度的设计之间只有一线之隔。答案取决于许多输入,其中我选择项目和模型广度最重要。

为了让我的答案更清楚,我不得不说我使用了不同的术语。 UI中采用的数据通常称为ViewModel。在您的情况下,您将构建包含必要信息子集的 UserViewModel

如果我正在处理一次性项目,我会将模型重用为 ViewModel。我将通过帮助方法删除敏感信息、加载或切断从数据库中延迟加载的数据以及对数据进行其他准备来做到这一点。所有这些都是使用相同的模型类完成的。

如果这不是一个短期项目,我希望创建从模型数据映射的单独 ViewModel 类。然后,如果我使用大部分平面数据,我会使用 AutoMapper tool 自动复制数据,而不是编写自己的映射器。

正如此处的另一个答案所述,您使用 UI 中所需的数据编写了一个基本类,并使用其他模型数据对其进行了扩展,但是由于多种原因,这不是一个好方法。

  1. 如果违反了关注点分离。处理模型和持久性的项目不应该知道您的 ViewModel
  2. 您可能需要将相关对象中的数据展平为 ViewModel 对象。在这种情况下,您的模型对象将包含不应该存在或多余的字段。
  3. 您可能需要 ViewModel 中的计算字段和辅助方法,它们最终会再次出现在模型中,这会使所有未更新设计的人感到困惑。
  4. 您可能希望对同一个 ViewModel 类采用多个不相关的模型类

简而言之,重用模型类或创建 ViewModel。不幸的是,没有聪明的解决方案。如果你找到了,请发表评论,因为我想听听:)

【讨论】:

    【解决方案2】:

    您可以重命名 PartialUserModel UserModelBase 类(或保持原样...这样做更符合逻辑)并使 UserModel 继承自它:

    public class UserModel : UserModelBase
    {
        ...
    }
    

    当然,在这种情况下,您需要从 UserModel 中删除所有重复的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      相关资源
      最近更新 更多