模型和部分模型,如何避免冗余代码?

时间:2012-11-29 16:48:18

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

我有一个模型和一个部分模型,它只包含我需要在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
    }
}

2 个答案:

答案 0 :(得分:1)

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

public class UserModel : UserModelBase
{
    ...
}

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

答案 1 :(得分:1)

在进行适当的设计和建立过度杀伤设计之间,这是一条细线。答案取决于许多输入,其中我选择了最重要的项目和模型广度。

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

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

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

正如另一个答案所述,您在UI中编写了一个包含所需数据的基本类,并将其与其他模型数据一起扩展,但由于多种原因,这不是一个好方法。

  1. 如果违反了关注点的分离。处理模型和持久性的项目不应该知道您的ViewModel
  2. 您可能需要将相关对象中的数据展平为ViewModel对象。在这种情况下,您的模型对象将具有不应存在的字段,或者将是多余的。
  3. 您可能需要ViewModel中的计算字段和辅助方法,这些方法和辅助方法将再次出现在模型中,使每个未更新设计的人感到困惑。
  4. 您可能希望将几个不相关的模型类应用于相同的ViewModel类
  5. 要尽快尝试,请重用模型类或创建ViewModel。遗憾的是没有聪明的解决方案。如果你找到一个,请发表评论,因为我想听听它:)