Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何跨同一实体的实例实施实体验证_C#_Validation_Entity_Domain Driven Design_Clean Architecture - Fatal编程技术网

C# 如何跨同一实体的实例实施实体验证

C# 如何跨同一实体的实例实施实体验证,c#,validation,entity,domain-driven-design,clean-architecture,C#,Validation,Entity,Domain Driven Design,Clean Architecture,在我们的项目中,我们使用DDD作为体系结构(清洁体系结构)。 假设我有一个叫做A的实体,A有一个叫做B的属性。 现在我需要一个验证,即当创建第二个实体a时,B在存储中的所有实例上都必须是唯一的 我的想法是使用存储库为它实现一个域服务。接下来的问题是,这个域服务是应该自己实现验证,还是仅仅为它提供数据。。。(在交互器/用例中用于验证) 示例代码(代码保持简单): 假设我有一个名为A的实体。A有一个名为B的属性。现在我需要一个验证,即当创建第二个实体A时,B在存储中的所有实例上都必须是唯一的 您试图

在我们的项目中,我们使用DDD作为体系结构(清洁体系结构)。 假设我有一个叫做A的实体,A有一个叫做B的属性。 现在我需要一个验证,即当创建第二个实体a时,B在存储中的所有实例上都必须是唯一的

我的想法是使用存储库为它实现一个域服务。接下来的问题是,这个域服务是应该自己实现验证,还是仅仅为它提供数据。。。(在交互器/用例中用于验证)

示例代码(代码保持简单):

假设我有一个名为A的实体。A有一个名为B的属性。现在我需要一个验证,即当创建第二个实体A时,B在存储中的所有实例上都必须是唯一的

您试图解决的问题有时称为

简单的答案是:引入一个索引,跟踪每个值B到允许拥有它的特定实体A的映射

当然,这会引起争论;您需要减轻同时修改两个不同A的情况。索引和所有A都成为需要管理的单个一致性边界的一部分。当我们将实体存储在单个RDBMS中时,会发生类似的情况——我们可以引入一个约束以确保没有重复项

您可以将单个一致性边界拆分为单独的A实体,也可以拆分为单独的B->A实体。但是现在,您可能会遇到同时修改两个不同的一致性边界的问题,这会引入竞争条件

第三种可能是放松一致性约束——允许存储冲突,并在以后解决它们。例如,请参见Greg Young on和Udi Dahan on

通常情况下,我们的答案是非常努力地推回这个需求,以确保它是真实的:如果违反了约束,业务的实际成本是多少


想想飞机座位图:显然只有一个乘客应该坐在一个座位上。但这并不意味着座位分配给多个人是一个严重的故障,因为人工操作人员(登机口代理)有办法缓解这些问题。另请参见Greg Young的演讲。

我认为可以选择域服务,看看这个博客(blog.sapiensworks.com/post/2017/08/23/…),其中给出了“用户名必须是唯一的”场景,与我在最初的帖子中的问题类似。

老实说,您显示的内容根本不干净:)您的模型有一个构造函数。但不管POV辩论如何,这项工作最好委托给一个底层框架。例如,如果针对内存存储进行编码,则创建一个
字典
,只需为
B
的所有值添加键即可。c#中的字典不允许重复键。如果针对db编码,则实现唯一约束。如果存储在平面文件中,则将其作为编写实际文件的类的作业。构造函数是否不干净?为什么不干净?这是创建包含所有必需字段(必填字段)的对象的最佳方法。这几乎涵盖了所有选项。我建议尽快解决问题,而不是晚些时候。这将是关于客户体验(UX或现实生活)。我宁愿坐在电脑前而不是在机场时收到座位问题的通知:P--如果这不是一个问题,请添加一个唯一的索引/约束,然后走那条路线。如果您暂时允许违规,则应尝试尽快解决。例如,在初始捕获之后可能有一个验证步骤。
public class A
{
   public A(string b)
   {
      B = b;
   }

   public string B {get; private set;}
}