将业务逻辑和数据访问逻辑分为两个不同的程序集时,我想抽象化身份的概念,以便业务逻辑将处理一个一致的身份类型,而不必了解其在数据源中的实际表示形式。
由于缺乏更好的用语,我一直将其称为复合身份抽象。
该项目中的数据源是可交换的,多种多样的,并且业务逻辑不应关心当前正在使用哪个数据源。身份是最困难的部分,因为其实现会随每种数据源而改变,而其他字段(如名称,地址等)始终是标量值。
我正在寻找的是一种抽象身份概念的好方法,无论是现有的库,软件模式还是答案中提供的某种可靠的好主意。
提议的复合标识值必须是可比较的并且可以在业务逻辑中使用(例如,绑定到组合框作为跟踪值),然后传递回数据源以指定要影响的记录,实体和/或文档,因此数据源必须能够解析出其自己的化合物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表示每个内容,以及不同标准化的语言代码,
第三类数据源可能只使用一个简单的标量值。
依此类推,您就明白了。
最佳答案
我怀疑抽象最好用一种比较方法(如IEquatable<T>
要求的一种)来表示,而不是带有属性语义的东西。
您的数据访问层最了解您的实体身份的含义,可以返回使用适当策略进行比较的对象:您的NoSQL存储将返回存储和比较GUID的实体实现,您的关系存储将返回存储该实体的实体实现并比较其复合键,依此类推。
关于c# - 提取出用于业务逻辑的复合标识值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5286495/