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的博客上看到它.在此方法中,实体仅负责发布由适当处理程序订阅的有意义事件.您可以在我的博客上阅读所有这些技术的完整比较.
希望有所帮助