当前位置: 首页 > 知识库问答 >
问题:

最佳实践是什么:Verticle中的业务逻辑还是单独的?

马高谊
2023-03-14

最近我开始用静态编程语言Vert. x编程,这个问题对于我们使用Vertx工具包的任何技术都是通用的。我创建了我的顶点,但在这些顶点中我有业务逻辑,我想知道什么是最佳实践:

1.将逻辑分离到一个独立的类中,在顶点中实例化它并执行其操作,只留下顶点来接收消息并将其传递到事件总线。

尽可能2.Implement同一垂直领域的逻辑。

下面我展示了一个代码示例,但正如你所看到的,是顶点本身的逻辑。从设计的角度来看,它就像这样,或者你应该把它带到一个独立的类中,并留下这个顶点,只用于在总线上接收和发送消息的操作。

class MyAPIAgentImpl(vertx: Vertx) : CoroutineVerticle() {

    var httpClient = HttpClient(vertx)
    var apiConfig: JsonObject = Config.get().getJsonObject("myapi")

override suspend fun start() {
      vertx.eventBus().consumer<JsonObject>(BusChannel.MY_API_CHANNEL) {
        message -> launch { message.reply(findElem(message.body().getLong("Id"),
        message.body().getString("countryCode"))) }
      }
  }

  override suspend fun findElem(Id: Long, countryCode: String): String {

      var hashMap = HashMap<String, String>()
      hashMap.put("Accept", "*/*")
      hashMap.put("Authorization", "Bearer XXXX")

      val baseUrl: String = apiConfig.get("apiBaseUrl")
      val port: Int = apiConfig.get("apiPort")
      val apiRelativeUrl: String = apiConfig.get("apiRelativeUrl")

      val resp: HttpResponse = httpClient.GET(String.format(baseUrl, countryCode), port,
        String.format(apiRelativeUrl, Id), hashMap, apiConfig.getLong("requestTimeout"))

    if (resp.status == HttpCode.OK) {
        return resp.message.get("msg")
      } else {
        logger.error("[HTTP CALL] My API response with error status code: ${resp.status}")
        throw ApiException(ErrorMessage(-1, resp.status, "Error calling external API"))
      }
  }

  companion object {
    private val logger = LoggerFactory.getLogger(MyAPIAgentImpl::class.java)
  }
}

我想知道你在使用Vertx设计应用程序时在这方面的意见和经验。

共有1个答案

华炜
2023-03-14

就像您的静止控制器/Servlet 中没有逻辑一样,最好将逻辑直接远离顶点。
原因保持不变,如果你想在以后使用不同的反应式库,你唯一担心的是用该库的细节而不是业务逻辑来改变顶点的这一层。
另外,如果您考虑分层方法,则处理事件和决定如何处理它们属于两个不同的层。
将纵向和逻辑合二为一将违反单一责任原则。

 类似资料:
  • 本文向大家介绍设计微服务的最佳实践是什么?相关面试题,主要包含被问及设计微服务的最佳实践是什么?时的应答技巧和注意事项,需要的朋友参考一下 以下是设计微服务的最佳实践: 为每个微服务分开数据存储 将代码保持在类似的成熟度等级上 为每个微服务进行单独的构建 部署到容器中 将服务器视为无状态的

  • 问题内容: 我刚开始学习Go,并通读现有代码以学习“其他人的做法”。在这种情况下,遍历使用go“工作区”,尤其是与项目依赖关系有关的地方。 在处理各种Go项目时,使用一个或多个Go工作区(即$ GOPATH的定义)的常见(或存在)最佳实践是什么?我应该期望有一个类似于我所有项目的中央代码存储库的Go工作区,还是在我处理这些项目时都明确将其分解并设置$ GOPATH(有点像python) virtu

  • 问题内容: 我正在构建一个基于expressjs的应用程序,我想在其中记录所有事件。我可以找到温斯顿,这似乎很酷。无论如何,我正在寻找一种方法将其连接到我的expressjs应用程序。 我还想要在应用程序内部登录。我的要求不是那么简单,所以我想将所有内容记录在我的应用程序中(不仅是请求)。 我目前的情况: server.js (我想在此级别记录http请求) 路线/something.js con

  • 我是这些概念的新手,目前正在尝试理解我正在使用MVC概念开发的应用程序中的业务和应用程序逻辑是什么。 在我看来,大多数人都同意这样一个事实:应用程序逻辑属于控制器,业务逻辑属于模型。这也是我想要确定什么是什么的原因,所以在读题的时候要记住这一点,以免错过重点。 我听到的一种方法是将业务逻辑更多地视为一种可以由那些与编程无关的人来描述的东西,而这些人只是试图解释一切将如何工作。所以这基本上涉及到要显

  • 问题内容: 我警告我。 然而,结构的嵌套是既定的编程技术,以及相当一些人在坚持它。 编辑:确实@vadian指出了Swift语言指南的规则: 要将类型嵌套在另一个类型中,请在其支持的类型的大括号内写入其定义。 类型可以嵌套到所需的多个级别 。 我知道它与泛型的使用发生冲突,并且Xcode可能会变得异常缓慢。实际上(通过测量最慢的编译点)是我开始研究此嵌套规则的原因。 实行皮棉规则的原因是什么?在这

  • 问题内容: 我将开始使用AngularJS进行客户端和Django进行服务器端项目。 使他们像最好的朋友一样工作的最佳实践是什么(静态文件,身份验证,部署等) 问题答案: 有多种方法可以从Django模板中为客户端模板提供支持,以实现有趣的优化。但是,鉴于Django和AngularJS的模板语言之间的相似之处,在这里几乎不值得付出任何努力。对于此类大多数项目,我会将AngularJS的静态服务与