由于存在被标记为主题的风险,我将以任何方式提出问题: - )
我最近加入了一个新的开发团队,他们习惯做以下事情。虽然我一直认为它是反模式,但我发现我无法解释原因。所以,我很想知道你的意见。
考虑以下情况:您有一个发票申请,当需要创建新发票时,它必须获得一个新的唯一发票号(如INV0001)。当然,它将存储在DB中,具有自动增量字段“id”的表中。所以,只需从id生成数字。
class Invoice{
[Key]
int Id { get; set;}
string Number => String.Concat("INV", this.Id.ToString().PadLeft(4, '0'));
}
我一直(盲目地)遵守“不要将id用作商业价值”的规则。但我无法真正激励它。
答案 0 :(得分:2)
请勿将ID用作商业价值
您可以应用用于激励关注点分离的相同解释。
如果在业务逻辑代码中使用Id
的实现细节的功能,例如由数据库生成,这意味着您的业务逻辑依赖于数据库实现。
Id
有一个责任 - 提供唯一价值,通过它您可以识别实体并将其与其他相关实体链接。因此,在业务逻辑中,您只能将Id
值用于相等条件。
例如,如果数据库生成Id
类型integer
而且你处于业务逻辑状态的某个地方
if (Id == 0)
{
return "new";
}
您的业务逻辑将取决于Id
实施(类型)。这意味着您只能使用值Id
的{{1}},而不能将其更改为integer
。