首页 > 解决方案 > 具有通用功能但功能参数不同的 API 的通用接口

问题描述

我正在开发一项物联网服务,该服务需要能够通过某种协议发送消息。我的目标是让我可以轻松地在这些协议实现之间进行交换。

在物联网中,用于消息传递的两种常见协议是 MQTT 和 WAMP。这些协议的两个流行的 Go 库都有相似的接口,但是它们各自的函数实现的参数不同。


例子:

MQTT

Publish(topic string, qos byte, retained bool, payload interface{}) Token

WAMP

Publish(topic string, options wamp.Dict, args wamp.List, kwargs wamp.Dict) error

我最初的想法是定义一个通用接口,在其中过滤掉我真正需要的所有参数:

Publish(topic string, payload map[string]interface{}, options map[string]interface{}) map[string]interface{}

但是,由于这两个库的签名完全不同,我不得不使用该interface{}类型。这反过来又会迫使我做大量的类型断言魔法和额外的工作以使其正常工作。

我完全错过了一些明显的东西吗?这个问题有什么更好的解决方案?或者我应该完全以不同的方式解决这个问题。

标签: gointerfacearchitecture

解决方案


我建议创建您自己的 API(以您需要的方式定义它),然后围绕实现您的 API 的每个库构建一个包装器。然后,在每个包装器中,您可以按照库实现它的方式应用您需要的功能。(我想这就是你正在尝试的。)

Publish函数可能如下所示:

Publish(topic string, payload map[string]interface{}) error

有效负载可以很容易地转换为wamp.Dict,因为它也是一个map[string]interfac{}. 它也可以传递给 MQTT,因为它接受任何interface{}.

不要试图从外部传递选项。而是根据需要在包装器中设置它们。或者,如果您需要对它们进行与外部不同的设置,请定义您自己的并根据每个包的需要对其进行解释。

只返回一个错误。在 MQTT 的情况下,Token正确解释 MQTT 包装器内部的内容。


推荐阅读