使用id作为商业价值的反模式

时间:2017-07-26 09:32:32

标签: c# database anti-patterns

由于存在被标记为主题的风险,我将以任何方式提出问题: - )

我最近加入了一个新的开发团队,他们习惯做以下事情。虽然我一直认为它是反模式,但我发现我无法解释原因。所以,我很想知道你的意见。

考虑以下情况:您有一个发票申请,当需要创建新发票时,它必须获得一个新的唯一发票号(如INV0001)。当然,它将存储在DB中,具有自动增量字段“id”的表中。所以,只需从id生成数字。

class Invoice{
     [Key]
     int Id { get; set;}

     string Number => String.Concat("INV", this.Id.ToString().PadLeft(4, '0'));
}

我一直(盲目地)遵守“不要将id用作商业价值”的规则。但我无法真正激励它。

1 个答案:

答案 0 :(得分:2)

  

请勿将ID用作商业价值

您可以应用用于激励关注点分离的相同解释。

如果在业务逻辑代码中使用Id的实现细节的功能,例如由数据库生成,这意味着您的业务逻辑依赖于数据库实现。

Id有一个责任 - 提供唯一价值,通过它您可以识别实体并将其与其他相关实体链接。因此,在业务逻辑中,您只能将Id值用于相等条件。

例如,如果数据库生成Id类型integer 而且你处于业务逻辑状态的某个地方

if (Id == 0)
{
    return "new";
}

您的业务逻辑将取决于Id实施(类型)。这意味着您只能使用值Id的{​​{1}},而不能将其更改为integer