Kotlin 如何描述事件结构和获取信息?
我想用kotlin编写一个DSL,描述事件存储中的事件,以根据这些描述生成Java代码、JSON示例、模式和文档。我目前的做法是: 保存事件结构的数据类Kotlin 如何描述事件结构和获取信息?,kotlin,Kotlin,我想用kotlin编写一个DSL,描述事件存储中的事件,以根据这些描述生成Java代码、JSON示例、模式和文档。我目前的做法是: 保存事件结构的数据类MyEvent data class MyEvent(val name: String, val version: Int, val content: Map<String, String>) 而“String(1256)”则表示其类型为String,最少1个字符,最多256个字符 要迭代所有事件以生成所需的一切,我需要手动将每个事
MyEvent
data class MyEvent(val name: String, val version: Int, val content: Map<String, String>)
而“String(1256)”则表示其类型为String
,最少1个字符,最多256个字符
要迭代所有事件以生成所需的一切,我需要手动将每个事件添加到列表/集合中
fun scanForAllMyEventsInstances(): Set<MyEvent> {
return hashSetOf(OrderCreated, OrderCancelled, OrderQuestioned)
}
fun scanforAllMyEventInstances():设置{
返回hashSetOf(OrderCreated、OrderCancelled、OrderQuestion)
}
这种方式感觉不是最好的方式
扫描AllMyEventInstances
中添加新事件。我只想描述一个新的事件MyEvent
的实例。这些都是“静态”信息我现在使用的是
SpringBoot
。所以不要犹豫,建议使用框架。我认为enum类是您的朋友
enum class MyEvent(val eventName: String, val version: Int, val content: Map<String, String>) {
OrderCreated("OrderCreated", 1, mapOf("orderId" to "UUID", "nameOfProduct" to "String(1, 256)", "quantity" to "Integer")),
OrderCancelled("OrderCancelled", 2, mapOf("orderId" to "UUID", "reason" to "String(100, 1000)")),
OrderQuestioned("OrderQuestioned", 3, mapOf("orderId" to "UUID", "question" to "String(10, 1000)"))
}
使用enum类的方法,我添加了一个接口,以便可以组织大量(不同的)事件
接口MyEvent2{
val eventName:String
val版本:Int
val内容:地图
}
枚举类MyOrderEvents:MyEvent2{
订单创建{
覆盖val eventName=“OrderCreated”
覆盖val版本=1
覆盖val content=mapOf(“orderId”到“UUID”,“产品名称”到“String(1256)”,“quantity”到“Integer”)
},
订单取消{
覆盖val eventName=“OrderCancelled”
覆盖val版本=2
覆盖val content=mapOf(“orderId”到“UUID”,“reason”到“String(1001000)”)
},
订单问题{
覆盖val eventName=“orderQuestibled”
覆盖val版本=3
覆盖val content=mapOf(“orderId”到“UUID”,“question”到“String(101000)”)
}
}
枚举类MyUserEvents:MyEvent2{
用户创建{
覆盖val eventName=“UserCreated”
覆盖val版本=1
重写val content=mapOf(“userId”到“UUID”,“name”到“String(1256)”)
},
用户删除{
覆盖val eventName=“UserDeleted”
覆盖val版本=2
覆盖val content=mapOf(“userId”到“UUID”)
},
用户更改{
覆盖val eventName=“UserChanged”
覆盖val版本=3
重写val content=mapOf(“userId”到“UUID”,“newName”到“String(1256)”)
}
}
我仍然需要将每个枚举类添加到列表/集合中
fun scanForAllMyEventsInstances(): Set<MyEvent2> {
val allEvents = HashSet<MyEvent2>()
allEvents.addAll(MyOrderEvents.values())
allEvents.addAll(MyUserEvents.values())
return allEvents
}
fun main() {
scanForAllMyEventsInstances().forEach{e -> println(e.eventName)}
}
fun scanforAllMyEventInstances():设置{
val allEvents=HashSet()
allEvents.addAll(MyOrderEvents.values())
allEvents.addAll(MyUserEvents.values())
回程通道
}
主要内容(){
scanforAllMyEventInstances().forEach{e->println(e.eventName)}
}
但每节课只上一次。该类中的每个新事件都会自动识别。对我来说没问题
备注:使用枚举类时不应使用val name
,因为在枚举类中已定义值name
。这就是为什么在MyEvent2
中它被称为eventName
。也许我甚至可以跳过name
/eventName
,因为它与枚举名是1:1
我要试试这个
PS:我认为这仍然不是一个好的DSL。但是优化这个,我将在以后的任务中完成。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。如果你足够的话,你就能做到。
MyEvent.values().forEach { println(it.eventName) }
interface MyEvent2 {
val eventName: String
val version: Int
val content: Map<String, String>
}
enum class MyOrderEvents : MyEvent2 {
OrderCreated {
override val eventName = "OrderCreated"
override val version = 1
override val content = mapOf("orderId" to "UUID", "nameOfProduct" to "String(1, 256)", "quantity" to "Integer")
},
OrderCancelled {
override val eventName = "OrderCancelled"
override val version = 2
override val content = mapOf("orderId" to "UUID", "reason" to "String(100, 1000)")
},
OrderQuestioned {
override val eventName = "OrderQuestioned"
override val version = 3
override val content = mapOf("orderId" to "UUID", "question" to "String(10, 1000)")
}
}
enum class MyUserEvents : MyEvent2 {
UserCreated {
override val eventName = "UserCreated"
override val version = 1
override val content = mapOf("userId" to "UUID", "name" to "String(1, 256)")
},
UserDeleted {
override val eventName = "UserDeleted"
override val version = 2
override val content = mapOf("userId" to "UUID")
},
UserChanged {
override val eventName = "UserChanged"
override val version = 3
override val content = mapOf("userId" to "UUID", "newName" to "String(1, 256)")
}
}
fun scanForAllMyEventsInstances(): Set<MyEvent2> {
val allEvents = HashSet<MyEvent2>()
allEvents.addAll(MyOrderEvents.values())
allEvents.addAll(MyUserEvents.values())
return allEvents
}
fun main() {
scanForAllMyEventsInstances().forEach{e -> println(e.eventName)}
}