【发布时间】:2022-08-22 23:38:52
【问题描述】:
假设我有一个用例需要调用客户端,定义为接口、端口。
我想为该端口使用一个实现(适配器)或另一个;并且选择使用哪一个取决于业务逻辑 - 例如,用户所在的国家/地区或更复杂的计算。
就设计模式而言,那种气味对我来说有点像工厂;我可以只输入一个函数来返回接口,其逻辑根据特定条件返回不同的实现。
但是,我在将其与我的架构知识以及什么是和不是领域相结合时遇到了麻烦:
-
如果我创建一个在一个适配器或另一个适配器之间进行选择的域函数,我需要将适配器(非域代码)导入到我的域中,这样我才能返回正确的那个。那是错误的,因为我让实现成为业务逻辑的一部分。
-
另一方面,我可以有一个“适配器适配器”:我通过端口“泄漏”选择适配器所需的数据作为合同的一部分,我有一个单一的“包装适配器”,我总是用于那个端口,它将调用重定向到任何可能的第三个适配器之一。这也是错误的,因为我在域外有业务逻辑(如何选择一个或另一个适配器),并且适配器调用其他适配器(?)。
我怎么解决这个问题?我没有看到第三个选项吗?
-
是否需要查询域层内部端口的各自实现?或者你能在应用层提前做出决定吗?
-
@afh 假设使用哪个实现的决定足够复杂,以至于选择本身可以被认为是域逻辑(需要从其他客户端检索数据或类似的东西)
标签: design-patterns domain-driven-design clean-architecture hexagonal-architecture