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

时间:2019-10-31 14:49:36

标签: kotlin design-patterns vert.x

最近,我开始使用Kotlin在Vert.x中进行编程,这个问题对于使用Vertx工具包的任何技术都是通用的。 我创建了自己的Verticle,但其中有业务逻辑,我想知道什么是最佳实践:

1。将逻辑分离为一个独立的类,在垂直实例中实例化它并执行其操作,只剩下垂直对象来接收消息并将消息传递到eventBus。

2。尽可能在同一顶点上执行逻辑。

下面,我将展示一个代码编写方式的示例,但是您可以看到,Verticle本身的逻辑。从设计的角度来看很像这样,或者您应该将它带到一个独立的类中,并仅将该顶点留给总线上的接收和发送消息的操作

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 个答案:

答案 0 :(得分:0)

就像您在RestController / Servlet中没有逻辑一样,优良作法是将逻辑直接远离Verticle。
原因仍然是一样的,如果您以后想使用其他Reactive库,则唯一的担心就是更改该Verticle层,使其具有该库的详细信息,而不是业务逻辑。
另外,如果您考虑采用分层方法,则处理事件并决定如何处理它们属于两个不同的层。
同时拥有纵向和逻辑将违反单一责任原则。

相关问题