我应该为具有实例变量的域服务实现Equality吗?

时间:2018-01-22 12:41:15

标签: c# domain-driven-design

请参阅此链接here。作者指出:“埃里克在他的书中指出,服务应该是无国籍的,虽然我们已经谈过这个问题而且他不再认为这是必要的 - 尽管你能做到这一点很好”

假设我有一个具有实例变量的域服务(从不变异)。我将如何处理平等问题。例如:

  1. 如果两个实体具有相同的ID

  2. ,则它们相等
  3. 如果所有成员具有相同的值

  4. ,则两个值对象相等

    我是否应该使用从未变异的实例变量为域服务实现/覆盖.Equals().GetHashcode()

    此外,如果域服务是无状态的,那么我猜不需要一个相等的方法吗?

1 个答案:

答案 0 :(得分:0)

  

我是否应该使用从未变异的实例变量为域服务实现/覆盖.Equals()和.GetHashcode()?

好吧,Fowler还指出in the same article在给定的执行上下文中通常只有一个域服务实例。

  

服务对象通常通过使用全局变量,类字段(罗伯特马丁术语中的单节点)或单例来实现。当然它们通常是单数的,因为你只有它们中的一个,但你如何做到这一点更加多样化。通常,奇点在处理上下文中 - 因此在多线程环境中每个线程一个。

域代码关注域服务的身份是非常不寻常的 - 这表明域对底层状态本身有一些兴趣,这通常会在代码中更明确地表达(即,通过为域代码提供与所述状态的更直接的连接。)

因此,我非常怀疑在域模型使用的接口中是否出现了对等式检查的模拟(sameServiceAs?)。

域服务接口的给定实现可能需要.Equals.GetHashCode来支持基础架构问题,我想 - 再次,考虑到通常只有其中一个,它有点奇怪