【问题标题】:Web API, AutoMapper and DTO/ModelWeb API、AutoMapper 和 DTO/模型
【发布时间】:2013-11-15 12:49:42
【问题描述】:

我将模型保存在模型程序集中,将 DTO 类保存在 DTO 程序集中。两者都在 WebAPI 项目中被引用并在那里创建映射。 WPF 客户端仅引用 DTO 程序集。

我的实体有一个“Id”标识属性,并且我将访问修饰符设置为 internal,以便仅在模型程序集中设置 id(由 EF6 支持)。甚至 DTO 中的 Id 都设置为 internal。

问题是当DTO到达客户端时,Id为0。我需要将可访问性设置为public吗?如果客户端更改 id 并保存实体怎么办?这会导致问题。

还有其他选择吗?

【问题讨论】:

  • 您只能将 getter 公开...顺便说一句,如果有人更改 dto 中的 id,当您保存或更新时,我看不到问题 - 这将是另一个实体。您将检查该 ANOTHER 实体的业务规则和权限。
  • 也许我解释的有点不清楚。例如,您有 User{Id = 1, Name = "Ivan"} 和 User{Id=2, Name="Piotr"}。有人将第一个实体的 ID 更改为 2 并提交更新。您的业​​务层从 ID = 2 的 DB 实体获取,并尝试将名称更改为 Ivan。现在,允许或拒绝此更改是您的业务规则:权限等。永远不要信任用户输入,只信任服务器端 - 检查服务器端用户提交的所有内容。
  • 就在这一刻,WPF 和 WebApi 共享同一个类,但它们不共享该类的实例。 WebApi 获取对象的序列化版本,由您决定如何将其附加到真实数据。 DTO - 简单的信封。
  • 有没有办法给Id属性添加一个属性,让客户端不能修改?
  • 如果客户端根本不使用 WPF 客户端怎么办?会直接调用你的web api吗?

标签: c# asp.net-web-api dto


【解决方案1】:

在服务器和客户端中,Id 字段不应为只读。

它们必须由 EF 在服务器中设置,并由序列化程序在客户端设置,因此您不希望使其无法访问。 如果您不想让用户弄乱它,我会说只是用 [Obsolete] 属性或其他警告用户的方式标记它,但您应该保持它可见和可编辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多