域数据模型中的非持久属性

时间:2018-11-09 13:27:13

标签: c# entity-framework viewmodel dto

我听说对于小型项目,不建议使用DTO,例如herehere。我想知道一个相当小的项目(团队合作)是否可以在域模型中合并非持久属性?例如:

namespace Domain.Entities
{
    public class Candidate : BaseEntity
    {
        public Candidate()
        {
            // some construction codes
        }

        // region persistent properties

        public string FirstName { get; set; }
        public string LastName { get; set; }
        public bool? IsMale { get; set; }
        public DateTime BirthDate { get; set; }
        // other properties ...


        // region non-persistent properties
        public string FullName => $"{FirstName} {LastName}";
    }
}

这只是保持简单还是失去有价值的东西吗?

1 个答案:

答案 0 :(得分:1)

我不提倡一种特定的方法,只是分享信息...

我不会将您对FullName的计算放在DTO中。 DTO只是一个简单的对象,实际上是一个结构,并且其中不应包含任何逻辑。 DTO的目的是将数据从一个层/层移动到另一层/层,并创建一个间接层,该层使您的域模型可以独立于客户端进行演化。实体上的全名作为非持久属性比在DTO中更有意义。如果您想成为一个完整的企业,它将在变压器/适配器中。

如果您的项目很小,并且可能永远不会增长,那么放弃DTO是可以接受的。请记住,如果您的项目不断增长,则可能需要进行一些重构,还有其他一些事情需要考虑...

DTO的另一个好处是将一些数据保留在需要保留的地方。例如,如果您的实体对象中包含敏感数据,并且没有放置适当的内容来阻止其在Web请求中返回,则您只是从应用服务器层泄漏了一些信息(请考虑用户中的密码字段)实体)。 DTO要求您考虑向/从客户端发送的内容,并使包含数据成为明确的故意行为与非故意行为。 DTO还使记录客户请求真正需要的内容变得更加容易。

话虽如此,每个DTO现在都是您必须编写和维护的代码,这是避免使用它们的主要原因,并且模型更改可能会在整个系统中产生明显的连锁反应。

这取决于决定如何处理潜在的数据泄漏,如何管理客户端(如果可以)以及模型可能变得多么复杂。