当我们将任何对象的 Db 标识符传递给 UI 时(假设是 url 查询字符串中对象的 PrimaryKey),我们不是基本上混合了两个层(Persistnet 层和表示层)吗?
数据库标识符在某种程度上听起来像是与持久层相关的数据,但是当我们“必须”在 UI 上传递它时,这不是一种不好的做法,我不知道什么可能是不过更好的一个。
是不是特殊情况?
简而言之,多层架构如何解决这种做法,将持久层数据传递给 UI?
当我们将任何对象的 Db 标识符传递给 UI 时(假设是 url 查询字符串中对象的 PrimaryKey),我们不是基本上混合了两个层(Persistnet 层和表示层)吗?
数据库标识符在某种程度上听起来像是与持久层相关的数据,但是当我们“必须”在 UI 上传递它时,这不是一种不好的做法,我不知道什么可能是不过更好的一个。
是不是特殊情况?
简而言之,多层架构如何解决这种做法,将持久层数据传递给 UI?
这是一种每个人都必须处理的泄漏抽象。
还有更多持久性泄漏到其他层的示例,例如验证域层中的字符串长度,因为数据库列中的长度设置为某个值。另一个示例可能是将 DAL 中的 EF IQueryable 暴露给域层,因为这样做会使潜在的数据库方案泄漏到域层。
所以我认为我们可以处理一个可接受的折衷方案,我们根本无法消除泄漏抽象,但我们应该努力至少做到这一点。将 ID 暴露给 UI 是我处理的一种可接受的折衷方案,因为它很简单并且每个人都理解它。
但如果有人有灵丹妙药,我会很高兴听到:)
应用程序用户需要标识符,以便她可以正确识别数据库中的数据并与之交互。在解决方案的所有层中公开相同的标识符并没有什么不好。没有它们就很难完成任何有用的事情。
我希望您实际上是在谈论代理键,而不是一般的标识符或“主键”。问题是,为什么您首先需要创建这样的密钥?原则上,代理键是从数据层中抽象出表示层的糟糕方法,因为它们会造成您所描述的那种困境。人们以这种方式使用它们的事实通常是由于: SQL 对键的支持很差,并且普遍缺乏数据独立性;行业不良做法的遗留问题;开发工具不足。