在将业务逻辑和数据访问逻辑分成两个不同的程序集时,我想抽象出身份的概念,因此业务逻辑将处理一个一致的身份类型,而不必理解它在数据源中的实际表示。
由于缺乏更好的术语,我一直称之为复合身份抽象。
此项目中的数据源是可交换的,各种各样的,业务逻辑不应关心当前使用的数据源。身份是最棘手的部分,因为它的实现可以改变每种数据源,而其他字段如名称,地址等一直是标量值。
我正在寻找的是一种抽象身份概念的好方法,无论是现有的图书馆,软件模式还是只是答案中提供的某种坚实的好主意。
建议的复合标识值必须在业务逻辑中具有可比性和可用性(例如,作为跟踪值绑定到组合框)并传递回数据源以指定要影响的记录,实体和/或文档,因此数据源必须能够解析其自身复合ID的详细信息。
数据来源示例:
这用于提供具有不同身份实现的各种数据源的含义。
关系数据源可能表示一段带有整数标识符和特定语言代码的内容。例如。
content_id language Other Columns expressing details of content 1 en_us 1 fr_ca
上例中第一条记录的标识是: 1 + en_us
但是,当替换 NoSQL数据源时,它可能以某种方式用GUID字符串 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 表示每段内容。加上不同标准化的语言代码,
第三种数据源可能只使用一个简单的标量值。
等等,你明白了。
答案 0 :(得分:2)
我怀疑抽象最好用比较方法(就像IEquatable<T>
所需的那个)来表示,而不是具有属性语义的东西。
您的数据访问层(它最了解您的实体标识的含义)可以返回使用适当策略来实现其比较的对象:您的NoSQL存储将返回存储和比较GUID的实体实现,您的关系存储将返回实体存储和比较其复合键的实现,等等。
答案 1 :(得分:1)
dynamic
类型会为您效果吗?
我认为只要您不在UI /业务逻辑级别分配ID,它就会起作用。比较应该有效。