将业务逻辑和数据访问逻辑分为两个不同的程序集时,我想抽象化身份的概念,以便业务逻辑将处理一个一致的身份类型,而不必了解其在数据源中的实际表示形式。

由于缺乏更好的用语,我一直将其称为复合身份抽象。

该项目中的数据源是可交换的,多种多样的,并且业务逻辑不应关心当前正在使用哪个数据源。身份是最困难的部分,因为其实现会随每种数据源而改变,而其他字段(如名称,地址等)始终是标量值。

我正在寻找的是一种抽象身份概念的好方法,无论是现有的库,软件模式还是答案中提供的某种可靠的好主意。

提议的复合标识值必须是可比较的并且可以在业务逻辑中使用(例如,绑定到组合框作为跟踪值),然后传递回数据源以指定要影响的记录,实体和/或文档,因此数据源必须能够解析出其自己的化合物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/

10-13 07:09