【问题标题】:non-persistent properties in domain data model域数据模型中的非持久属性
【发布时间】:2018-11-09 13:27:12
【问题描述】:

我听说对于小型项目不推荐使用 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}";
    }
}

这只是保持简单还是这样失去了任何有价值的东西?

【问题讨论】:

  • 当然,将所有方法放在一个地方很好,但我想这会混淆持久性。这完全取决于您如何读取数据和持久化数据。
  • 我应该在问题中提供哪些额外信息?
  • 如果您这样做,您需要在 fluent 配置中将非持久属性标记为 [NotMapped()].Ingore()。而且您将无法在 LINQ 查询中查询这些属性。
  • @DavidBrowne-Microsoft 不会 EF 自动忽略只读属性?
  • @roozbehS 我不知道,但如果是这样就有意义了。

标签: c# entity-framework viewmodel dto


【解决方案1】:

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

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

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

DTO 的另一个好处是将一些数据保留在需要保留的位置。例如,如果您的实体对象中有敏感数据,并且您没有放置一些东西来防止它在 Web 请求中被返回,那么您只是从您的应用服务器层泄露了一些信息(想想您的用户中的密码字段实体)。 DTO 要求您考虑向客户端发送/从客户端发送的内容,并使包含数据成为明确的有意行为与无意行为。 DTO 还可以更轻松地记录客户请求的真正要求。

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

这归结为决定您希望如何处理潜在的数据泄漏、您希望如何管理您的客户(如果可以的话)以及您的模型可能变得多复杂。

【讨论】:

  • 感谢您的回答。我的项目是一个winform,所以我想不必担心数据泄漏。我说的对吗?
  • 可能不会,除非您从进程外或客户端发送/接收数据。
猜你喜欢
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多