spartacus-storefront - 在 Spartacus Storefront 中集成自定义 API
问题描述
我们的 Hybris 实例有一些自定义 REST API,例如addEntry。这个版本的 API 在负载中需要一个额外的布尔参数,我们称之为fooBar。这是有效载荷的示例:
{"quantity": 1, "product": {"code": "1234567"}, "fooBar": false}
以下是我们为在实际进行 http 调用的服务中拥有这个额外参数所做的工作的列表:
- 重写了AddToCartComponent
- 修改了addToCart方法,将fooBar参数传递给E2ActiveCartService的addEntry方法
- E2ActiveCartService 中的扩展 ActiveCartService
- 修改了将fooBar参数传递给E2MultiCartService 的 addEntry方法的addEntry方法
- E2MultiCartService中的扩展MultiCartService
- 修改了将fooBar参数传递给E2CartAddEntry操作的负载的addEntry方法
- 使用自己的类型(即'[E2-Cart-entry] Add Entry')实现了CartAddEntry操作的副本(称为E2CartAddEntry )
- 实现了一个新的CartEntryEffects(称为E2CartEntryEffects),它监听E2CartAddEntry动作
- 创建了名为processesIncrement$的第二个效果,它调度CartActions.CartProcessesIncrement操作(我们这样做是因为E2CartAddEntry不能扩展EntityProcessesIncrementAction类)
- 复制原始CartEntryEffects中的addEntry$效果,将fooBar参数添加到E2CartEntryConnector的add方法中
- E2CartEntryConnector中的扩展CartEntryConnector
- 修改了将fooBar参数传递给E2CartEntryAdapter的add方法的add方法
- E2CartEntryAdapter中的扩展CartEntryAdapter
- 修改抽象add方法添加fooBar参数
- 创建了扩展OccCartEntryAdapter并实现E2CartEntryAdapter的 E2OccCartEntryAdapter
- 修改了add方法,将fooBar添加到从HttpClient发出的 POST 调用的负载中
- 最后,在我们的主模块中,我们更改了提供程序:
[
{ provide: ActiveCartService, useClass: E2ActiveCartService },
{ provide: MultiCartService, useClass: E2MultiCartService },
E2CartEntryEffects,
{ provide: CartEntryConnector, useClass: E2CartEntryConnector },
{ provide: E2CartEntryAdapter, useClass: E2OccCartEntryAdapter },
]
这个解决方案似乎有效,但我们认为对于一个相对简单的更改来说这相当复杂,我们想知道我们的方法是否正确,或者是否有更好、更清洁的方法。
亲切的问候
解决方案
目前,这似乎是这个特定用例的正确方法。
您没有确切指定fooBar
用于什么,但我认为它已被使用并且可以在顶层层(在 UI 组件中)内切换,并且必须由所有其他层向下传递给适配器。
另一方面,例如,fooBar
如果只是Product
模型的一个属性,那么只需扩展“产品”模型+重要的更改(组件,适配器),所有其他地方都可以保持不变(只会通过扩展模型)。
您能否提供更多有关所需更改的背景信息,以便我们更好地理解它,并使其在未来变得更容易?
在不久的将来,我们正在考虑通过 Spartacus 中的所有层来统一外观服务的负载,因此向任何核心逻辑添加更多上下文将大大简化(基本上将归结为第二个示例,关于扩展Product
模型)。
推荐阅读
- reactjs - 从上下文对象数组中获取不同属性到另一个上下文的更好方法是什么?(反应,打字稿,上下文)
- npm - 如何在 Yarn 2 中列出和使用包?
- reactjs - 在 saga 调用效果中没有重载匹配此调用
- c++ - 如何使用 boost beast websocket 客户端收听 websocket 提要?
- linux - 在 Linux 下安装虚幻引擎的几个问题
- python - Python在内存中生成tets图像文件
- reactjs - 如何获取 Algolia 搜索结果的类型?
- flutter - 使用 Provider Package Flutter 时如何修复错误
- python - _run_module_as_main 中的文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.2032.0_x64__qbz5n2kfra8p0\lib\runpy.py”,第 193 行
- android - 无法找到具有路径的平台 SDK:平台;android-R