C# 抽象出一个复合标识值以用于业务逻辑?

C# 抽象出一个复合标识值以用于业务逻辑?,c#,.net,architecture,C#,.net,Architecture,在将业务逻辑和数据访问逻辑分离为两个不同的程序集时,我想抽象出标识的概念,以便业务逻辑将处理一个一致的标识类型,而不必了解其在数据源中的实际表示 我一直称之为复合身份抽象,因为没有更好的术语 此项目中的数据源是可交换的、多种多样的,业务逻辑不应该关心当前使用的是哪个数据源。标识是最难的部分,因为它的实现可以根据数据源的类型而改变,而其他字段(如名称、地址等)则始终是标量值 我正在寻找的是一种很好的方法来抽象身份的概念,无论是现有的库、软件模式还是答案中提供的某种可靠的好主意。 提议的复合标识值必

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

我一直称之为复合身份抽象,因为没有更好的术语

此项目中的数据源是可交换的、多种多样的,业务逻辑不应该关心当前使用的是哪个数据源。标识是最难的部分,因为它的实现可以根据数据源的类型而改变,而其他字段(如名称、地址等)则始终是标量值

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

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

数据源示例:

这有助于理解我所说的具有不同标识实现的各种数据源的含义

  • 关系数据源可能使用整数标识符加上特定于语言的代码来表示一段内容。比如说

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

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

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


  • 诸如此类,你就明白了。

    我认为抽象最好用比较方法(如所需的方法)来表示,而不是用属性语义来表示


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

    动态
    类型是否适合您


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

    您是否能够比较来自不同数据源的两个实体?如果您的实体都有一个
    IsSameAs
    方法,这能解决问题吗?不需要比较来自两个不同数据源的身份,因为一次只有一个。+1我不会撒谎:我喜欢这个。有趣的是,在过去的两周里,我发现自己在两个不同的场合,包括这一次,都在为
    dynamic
    辩护。每次我确定要使用它时,我都会发现有一个合适的解决方案。我想用它。我认为我当前项目实现的细节不适合动态运行时解析,尽管可以实现对象和值的隐式相等和可比较属性,这是很好的。+1好的想法。您是对的,我的身份抽象最好通过现有的.NET接口来实现,这些接口可以进行比较和平等性检查,我可以利用这些接口。此外,我还可以为特殊场景提供备用/自定义实现。在发布之前,我曾尝试使用定制的
    IIdentifiable
    IIdentityAdapter
    接口来实现这一想法——我不会详细介绍,但可以说我很快就意识到这些概念有助于进行更多的工作,而且这看起来并不明智。我更喜欢你的方式。简单明了。
       content_id  language  Other Columns expressing details of content
                 1  en_us
                 1  fr_ca