gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:21:19 28 4
gpt4 key购买 nike

这是一个有效的对象设计吗?
我有一个域对象,我在其中注入(inject)服务并调用验证方法来更新对象的状态,如果一切顺利,则发送确认消息。代码如下所示:

class Foo {
String bar
Service emailService


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

Foo.get(1).verify()

在这样的地方调用 emailService 是否可以接受?有没有我可以遵循的设计模式用于这种情况。

谢谢
- 肯

最佳答案

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

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

Jimmy Bogard 解释了原因 injecting services into entities is a bad idea .

而不是它,他建议使用' double dispatch '(这个名字是否合适有一些争论)模式来解决这个问题。在这种方法中,域方法被调用者为域方法提供服务实现。在您的情况下,它看起来像这样:

class Foo {
String bar

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

Foo.get(1).verify(new Service(...))

最后一个(但并非最不重要的)选项是使用领域事件模式。您可以在 Udi Dahan's blog 上阅读相关信息.在这种方法中,实体只负责发布由适当的处理程序订阅的有意义的事件。您可以阅读所有这些技术的完整比较 on my blog .

希望有帮助

关于design-patterns - 在域对象方法中封装服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3622769/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com