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



最近我开始用Kotlin在Vert.x中编程,这个问题对于我们使用Vertx工具包的任何技术来说都是通用的。我创建了垂直领域,但在这些领域我有商业逻辑,我想知道什么是最佳实践:

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

2.尽可能在同一垂直领域实现逻辑。

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

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 应用程序设计方面的意见和经验

就像RestController/Servlet中没有逻辑一样,直接让逻辑远离Verticle也是一种很好的做法
原因不变,如果您以后想使用不同的Reactive库,您唯一担心的是更改这一层Verticle库的细节,而不是业务逻辑
此外,如果您考虑了分层方法,则处理事件和决定如何处理事件分为两个不同的层
将纵向和逻辑合二为一将违反单一责任原则。

相关内容

最新更新