摘要用于业务逻辑的复合身份值?

时间:2011-03-13 00:05:03

标签: c# .net architecture

在将业务逻辑和数据访问逻辑分成两个不同的程序集时,我想抽象出身份的概念,因此业务逻辑将处理一个一致的身份类型,而不必理解它在数据源中的实际表示。

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

此项目中的数据源是可交换的,各种各样的,业务逻辑不应关心当前使用的数据源。身份是最棘手的部分,因为它的实现可以改变每种数据源,而其他字段如名称,地址等一直是标量值。

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

建议的复合标识值必须在业务逻辑中具有可比性和可用性(例如,作为跟踪值绑定到组合框)并传递回数据源以指定要影响的记录,实体和/或文档,因此数据源必须能够解析其自身复合ID的详细信息。

数据来源示例:

这用于提供具有不同身份实现的各种数据源的含义。

  1. 关系数据源可能表示一段带有整数标识符和特定语言代码的内容。例如。

       content_id  language  Other Columns expressing details of content
                 1  en_us
                 1  fr_ca
    

    上例中第一条记录的标识是: 1 + en_us

  2. 但是,当替换 NoSQL数据源时,它可能以某种方式用GUID字符串 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 表示每段内容。加上不同标准化的语言代码,

  3. 第三种数据源可能只使用一个简单的标量值。

  4. 等等,你明白了。

2 个答案:

答案 0 :(得分:2)

我怀疑抽象最好用比较方法(就像IEquatable<T>所需的那个)来表示,而不是具有属性语义的东西。

您的数据访问层(它最了解您的实体标识的含义)可以返回使用适当策略来实现其比较的对象:您的NoSQL存储将返回存储和比较GUID的实体实现,您的关系存储将返回实体存储和比较其复合键的实现,等等。

答案 1 :(得分:1)

dynamic类型会为您效果吗?

我认为只要您不在UI /业务逻辑级别分配ID,它就会起作用。比较应该有效。