在域对象方法中封装服务调用

ken*_*ken 6 design-patterns domain-driven-design

这是一个有效的对象设计吗?我有一个域对象,我注入一个服务,并调用验证方法来更新对象的状态,如果一切顺利,发送一条确认消息.代码如下:

class Foo {
  String bar
  Service emailService


  public boolean verify() {
    bar = "foo"
        if(this.save()) {
            emailService.sendConfirmation()
        }
  }
}

Foo.get(1).verify()
Run Code Online (Sandbox Code Playgroud)

在这样的情况下调用emailService是否可以接受?是否有一种设计模式,我可以遵循这种情况使用.

谢谢 - 肯

Szy*_*ega 11

从实体调用服务没有任何问题.但是,在实例化这些服务方面存在一些问题.如果您遵循此路径,则必须以某种方式在实体创建期间获取服务实例,这是有问题的.

直接调用构造函数显然是个坏主意(因为它将实体耦合到服务实现).

Jimmy Bogard解释了为什么向实体注入服务是一个坏主意.

而不是它,他建议使用" 双重调度 "(如果这个名称合适,有一些辩论)模式来解决这个问题.在此方法中,域方法被调用者向域方法提供服务实现.在你的情况下,它看起来像这样:

class Foo {
  String bar    

  public boolean verify(Service emailService) {
    bar = "foo"
        if(this.save()) {
            emailService.sendConfirmation()
        }
  }
}

Foo.get(1).verify(new Service(...))
Run Code Online (Sandbox Code Playgroud)

最后(但并非最不重要)选项是使用域事件模式.你可以在Udi Dahan的博客上看到它.在此方法中,实体仅负责发布由适当处理程序订阅的有意义事件.您可以在我的博客上阅读所有这些技术的完整比较.

希望有所帮助