我对如何按照六角体系结构或端口和适配器模式实现我的风格练习的简单场景有一些疑问。
我有一个用例(或服务),它必须发送一个联系人(从联系人表单接收)到一个外部API服务。
public class SendContactUseCase{
//output port interface
private final SendContact sendContact;
public ServiceLayer(SendContact sendContact) {
this.sendContact = sendContact;
}
public void sendContact(ContactRequest req){
sendContact.send(req);
}
}
因此,我使用方法send(ContactRequest req)
创建了一个输出端口,然后将此接口实现为一个驱动适配器,并在其中放置与API通信的代码
//driven adapter
public class SendContactToAPIAdapter implements SendContact {
//private final PossibleAPILib possibleAPIlib...;
@Override
public boolean send(ContactRequest req) {
//HERE the code to communicate with API
}
}
这里我的疑问是,如果稍后需要将“联系人”也发送到另一个通道,例如作为特定电子邮件地址的XML附件,该怎么办?
如果我正确地理解了Port & Adapter模式隐藏了用例的基础设施“逻辑”,我应该从同一个端口实现一个新的驱动适配器,以便在用例中注入正确的适配器。
public class SendContactXMLAdapter implements SendContact
但是,如果我应该调用两个适配器呢?因为我必须将联系人发送到两个系统?我应该创建第三个适配器来隐藏调用两个系统的逻辑吗?
我希望我已经说清楚了谢谢大家
为简单用例创建示例Java项目
1条答案
按热度按时间6ie5vjzr1#
答案取决于你实际上想完成什么。
对我来说,您对“需要将“联系人”也发送到另一个渠道“的预期听起来像是您的业务逻辑的一个附加功能。
基于这个假设,我将实现两个独立的端口/适配器对,一个用于API,一个用于XML,然后您的用例可以决定调用哪个端口。
这个图表形象地表达了我的意思:Component Architecture
如果你真的总是想把联系人发送到API * 并 * 导出为XML,你可以保持用例不变,只需要扩展你的
SendContactToAPIAdapter
实现就可以了,但是你也应该考虑重命名它。