【问题标题】:Should I be implementing Equality for a Domain Service with Instance Variables?我应该为具有实例变量的域服务实现平等吗?
【发布时间】:2018-01-22 12:41:15
【问题描述】:

请查看此链接here。作者指出:“Eric 在他的书中指出,服务应该是无状态的,尽管我们已经讨论过这一点,但他不再认为这是必要的——尽管如果你能做到,那就太好了”

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

  1. 如果两个实体具有相同的 ID,则它们是相等的

  2. 如果所有成员的值相同,则两个值对象相等

我是否应该为域服务实现/覆盖.Equals().GetHashcode(),实例变量从不发生变化?

另外,如果域服务是无状态的,那么我想就不需要相等方法了吗?

【问题讨论】:

  • 你能解释一下你得到相同服务的两个不同实例的情况吗?为什么要比较它们是否相等?
  • @Euphoric,我想不出一个。如果域服务没有实例变量,那么它们只能通过引用进行比较(意味着不需要 .equals)。对吗?
  • 我认为域服务最多应该是线程本地(或请求本地)的单例。因此,实际上不可能在同一段代码中拥有单个服务的多个实例。所以他们对平等的定义是没有意义的。
  • @w0051977 这些实例变量是什么?他们是私人的吗?你能让他们readonly吗?既然它们永远不会发生变异,你凭什么说服务是有状态的?
  • 服务本质上需要是无状态的,因为没有需要持久化的状态。但是,您可以具有瞬态只读状态,这没关系。任何需要在使用之间保存业务数据的东西都应该是一个值对象(通常作为涉及实体的聚合的一部分)

标签: c# domain-driven-design


【解决方案1】:

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

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

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

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

因此,如果在域模型使用的界面中看到类似于相等性检查( sameServiceAs ?),我会非常怀疑。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2020-09-13
    相关资源
    最近更新 更多