修改ID泛型名称,重构Serialization内容

This commit is contained in:
2022-07-27 15:23:19 +08:00
parent 7692fb502b
commit a0cfba5dd9
37 changed files with 210 additions and 189 deletions

View File

@@ -1,21 +0,0 @@
package com.synebula.gaea.data
/**
* 对象转换器,支持对象之间的转换。
*
* @author alex
* @version 0.1
* @since 2020-05-15
*/
interface IObjectConverter {
/**
* 转换源对象到目标对象。
*
* @param src 源对象。
* @param dest 目标对象。
* @param <T> 目标对象类型。
* @return 目标对象
*/
fun <T> convert(src: Any, dest: Class<T>): T
}

View File

@@ -8,7 +8,7 @@ import java.util.*
*
* @param T 消息数据类型
*/
open class DataMessage<T>() : Message() {
open class DataMessage<T>() : StatusMessage() {
/**
* 传递的业务数据

View File

@@ -0,0 +1,16 @@
package com.synebula.gaea.data.message
/**
* 消息结构
*/
interface IMessage {
/**
* 命令载荷, 实际的业务数据
*/
var message: String
/**
* 时间戳。
*/
var timestamp: Long
}

View File

@@ -1,6 +1,6 @@
package com.synebula.gaea.data.message
open class Message {
open class StatusMessage {
/**
* 状态200成功400错误500异常
*/

View File

@@ -2,16 +2,17 @@ package com.synebula.gaea.data.serialization
/**
* 序列化器
* @param <S> 源数据类型
*/
interface IDeserializer {
interface IDeserializer<S> {
/**
* 反序列化
*
* @param <S> 源数据类型
* @param <T> 目标数据类型
* @param src 源数据
* @param targetClass 目标对象。
* @return 目标数据
*/
fun <S, T> deserialize(src: S): T
fun <T> deserialize(src: S, targetClass: Class<T>): T
}

View File

@@ -0,0 +1,10 @@
package com.synebula.gaea.data.serialization
/**
* 对象映射器,支持对象之间的转换。
*
* @author alex
* @version 0.1
* @since 2020-05-15
*/
interface IObjectMapper : IDeserializer<Any>

View File

@@ -2,16 +2,16 @@ package com.synebula.gaea.data.serialization
/**
* 序列化器
* @param <T> 目标数据类型
*/
interface ISerializer {
interface ISerializer<T> {
/**
* 序列化
*
* @param <S> 源数据类型
* @param <T> 目标数据类型
*
* @param src 源数据
* @return 目标数据
*/
fun <S, T> serialize(src: S): T
fun <S> serialize(src: S): T
}

View File

@@ -1,15 +1,8 @@
package com.synebula.gaea.data.serialization.json
import com.synebula.gaea.data.serialization.IDeserializer
/**
* 序列化器
*/
interface IJsonDeserializer {
/**
* 反序列化
*
* @param <T> 目标数据类型
* @param src Json字符串数据
* @return 目标数据
*/
fun <T> deserialize(src: String): T
}
interface IJsonDeserializer : IDeserializer<String>

View File

@@ -1,15 +1,8 @@
package com.synebula.gaea.data.serialization.json
import com.synebula.gaea.data.serialization.ISerializer
/**
* 序列化器
*/
interface IJsonSerializer {
/**
* 序列化
*
* @param <S> 源数据类型
* @param src 源数据
* @return Json字符串
*/
fun <S> serialize(src: S): String
}
interface IJsonSerializer : ISerializer<String>

View File

@@ -1,5 +1,5 @@
package com.synebula.gaea.domain.model
abstract class AggregateRoot<TKey> : Entity<TKey>(), IAggregateRoot<TKey> {
abstract class AggregateRoot<ID> : Entity<ID>(), IAggregateRoot<ID> {
override var alive: Boolean = true
}

View File

@@ -1,3 +1,3 @@
package com.synebula.gaea.domain.model
abstract class Entity<TKey> : IEntity<TKey>
abstract class Entity<ID> : IEntity<ID>

View File

@@ -5,7 +5,7 @@ package com.synebula.gaea.domain.model
*
* @author alex
**/
interface IAggregateRoot<TKey> : IEntity<TKey> {
interface IAggregateRoot<ID> : IEntity<ID> {
/**
* 实体对象是否有效。

View File

@@ -5,13 +5,13 @@ package com.synebula.gaea.domain.model
*
* @author alex
*
* @param <TKey> 主键的类型。
* @param <ID> 主键的类型。
**/
interface IEntity<TKey> {
interface IEntity<ID> {
/**
* 实体ID
*/
var id: TKey?
var id: ID?
}

View File

@@ -7,7 +7,7 @@ import java.util.*
* 记录信息
* 添加了创建和修改的人\时间信息
*/
abstract class Record<TKey> {
abstract class Record<ID> {
//记录增加信息
var creator: String? = null

View File

@@ -13,7 +13,7 @@ interface IRepository {
* @param obj 需要插入的对象。
* @return 返回原对象如果对象ID为自增则补充自增ID。
*/
fun <TAggregateRoot : IAggregateRoot<TKey>, TKey> add(obj: TAggregateRoot, clazz: Class<TAggregateRoot>)
fun <TAggregateRoot : IAggregateRoot<ID>, ID> add(obj: TAggregateRoot, clazz: Class<TAggregateRoot>)
/**
* 插入多个个对象。
@@ -21,7 +21,7 @@ interface IRepository {
* @param obj 需要插入的对象。
* @return 返回原对象如果对象ID为自增则补充自增ID。
*/
fun <TAggregateRoot : IAggregateRoot<TKey>, TKey> add(obj: List<TAggregateRoot>, clazz: Class<TAggregateRoot>)
fun <TAggregateRoot : IAggregateRoot<ID>, ID> add(obj: List<TAggregateRoot>, clazz: Class<TAggregateRoot>)
/**
* 更新对象。
@@ -29,7 +29,7 @@ interface IRepository {
* @param obj 需要更新的对象。
* @return
*/
fun <TAggregateRoot : IAggregateRoot<TKey>, TKey> update(obj: TAggregateRoot, clazz: Class<TAggregateRoot>)
fun <TAggregateRoot : IAggregateRoot<ID>, ID> update(obj: TAggregateRoot, clazz: Class<TAggregateRoot>)
/**
* 通过id删除该条数据
@@ -37,7 +37,7 @@ interface IRepository {
* @param id id
* @param clazz 操作数据的类型
*/
fun <TAggregateRoot : IAggregateRoot<TKey>, TKey> remove(id: TKey, clazz: Class<TAggregateRoot>)
fun <TAggregateRoot : IAggregateRoot<ID>, ID> remove(id: ID, clazz: Class<TAggregateRoot>)
/**
* 根据ID获取对象。
@@ -46,7 +46,7 @@ interface IRepository {
* @param clazz 操作数据的类型
* @return 聚合根
*/
fun <TAggregateRoot : IAggregateRoot<TKey>, TKey> get(id: TKey, clazz: Class<TAggregateRoot>): TAggregateRoot?
fun <TAggregateRoot : IAggregateRoot<ID>, ID> get(id: ID, clazz: Class<TAggregateRoot>): TAggregateRoot?
/**

View File

@@ -10,7 +10,7 @@ import com.synebula.gaea.domain.model.IAggregateRoot
* @param <TAggregateRoot> this T is the parameter
* @author alex
*/
interface ISpecificRepository<TAggregateRoot : IAggregateRoot<TKey>, TKey> {
interface ISpecificRepository<TAggregateRoot : IAggregateRoot<ID>, ID> {
/**
* 仓储的对象类
@@ -39,7 +39,7 @@ interface ISpecificRepository<TAggregateRoot : IAggregateRoot<TKey>, TKey> {
* @param id
* @return
*/
fun remove(id: TKey)
fun remove(id: ID)
/**
* 根据ID获取对象。
@@ -47,16 +47,7 @@ interface ISpecificRepository<TAggregateRoot : IAggregateRoot<TKey>, TKey> {
* @param id 对象ID。
* @return
*/
fun get(id: TKey): TAggregateRoot
/**
* 根据ID获取对象。
*
* @param id id
* @param clazz 操作数据的类型
* @return 聚合根
*/
fun <T : IAggregateRoot<TKey>, TKey> get(id: TKey, clazz: Class<T>): T
fun get(id: ID): TAggregateRoot
/**

View File

@@ -12,19 +12,19 @@ interface IContext : IUnitOfWork {
* 将指定的聚合根标注为“新建”状态。
* @param obj
*/
fun <TType : IAggregateRoot<TKey>, TKey> add(obj: TType)
fun <TType : IAggregateRoot<ID>, ID> add(obj: TType)
/**
* 将指定的聚合根标注为“更改”状态。
*
* @param obj
*/
fun <TType : IAggregateRoot<TKey>, TKey> update(obj: TType)
fun <TType : IAggregateRoot<ID>, ID> update(obj: TType)
/**
* 将指定的聚合根标注为“删除”状态。
*
* @param obj
*/
fun <TType : IAggregateRoot<TKey>, TKey> remove(obj: TType)
fun <TType : IAggregateRoot<ID>, ID> remove(obj: TType)
}

View File

@@ -1,7 +1,7 @@
package com.synebula.gaea.domain.service
import com.synebula.gaea.data.message.DataMessage
import com.synebula.gaea.data.message.Message
import com.synebula.gaea.data.message.StatusMessage
import com.synebula.gaea.log.ILogger
@@ -11,24 +11,24 @@ import com.synebula.gaea.log.ILogger
* @version 0.0.1
* @since 2016年9月18日 下午2:23:15
*/
interface IService<TKey> {
interface IService<ID> {
/**
* 日志组件。
*/
var logger: ILogger
fun add(command: ICommand): DataMessage<TKey>
fun add(command: ICommand): DataMessage<ID>
fun update(id: TKey, command: ICommand)
fun update(id: ID, command: ICommand)
fun remove(id: TKey)
fun remove(id: ID)
/**
* 添加一个删除对象前执行监听器。
* @param key 监听器标志。
* @param func 监听方法。
*/
fun addBeforeRemoveListener(key: String, func: (id: TKey) -> Message)
fun addBeforeRemoveListener(key: String, func: (id: ID) -> StatusMessage)
/**
* 移除一个删除对象前执行监听器。

View File

@@ -1,7 +1,7 @@
package com.synebula.gaea.domain.service
import com.synebula.gaea.data.message.DataMessage
import com.synebula.gaea.data.message.Message
import com.synebula.gaea.data.message.StatusMessage
import com.synebula.gaea.domain.model.IAggregateRoot
import com.synebula.gaea.log.ILogger
@@ -12,24 +12,24 @@ import com.synebula.gaea.log.ILogger
* @version 0.0.1
* @since 2016年9月18日 下午2:23:15
*/
interface ILazyService<TAggregateRoot : IAggregateRoot<TKey>, TKey> {
interface ISimpleService<TAggregateRoot : IAggregateRoot<ID>, ID> {
/**
* 日志组件
*/
var logger: ILogger
fun add(root: TAggregateRoot): DataMessage<TKey>
fun add(root: TAggregateRoot): DataMessage<ID>
fun update(id: TKey, root: TAggregateRoot)
fun update(id: ID, root: TAggregateRoot)
fun remove(id: TKey)
fun remove(id: ID)
/**
* 添加一个删除对象前执行监听器
* @param key 监听器标志
* @param func 监听方法
*/
fun addBeforeRemoveListener(key: String, func: (id: TKey) -> Message)
fun addBeforeRemoveListener(key: String, func: (id: ID) -> StatusMessage)
/**
* 移除一个删除对象前执行监听器

View File

@@ -1,8 +1,8 @@
package com.synebula.gaea.domain.service
import com.synebula.gaea.data.IObjectConverter
import com.synebula.gaea.data.message.DataMessage
import com.synebula.gaea.data.message.Message
import com.synebula.gaea.data.message.StatusMessage
import com.synebula.gaea.data.serialization.IObjectMapper
import com.synebula.gaea.domain.model.IAggregateRoot
import com.synebula.gaea.domain.repository.IRepository
import com.synebula.gaea.log.ILogger
@@ -14,30 +14,30 @@ import com.synebula.gaea.log.ILogger
*
* @param repository 仓储对象
* @param clazz 聚合根类对象
* @param converter 对象转换组件
* @param deserializer 对象转换组件
* @param logger 日志组件
* @author alex
* @version 0.1
* @since 2020-05-17
*/
open class Service<TAggregateRoot : IAggregateRoot<TKey>, TKey>(
protected open var clazz: Class<TAggregateRoot>,
protected open var repository: IRepository,
protected open var converter: IObjectConverter,
override var logger: ILogger
) : IService<TKey> {
open class Service<TAggregateRoot : IAggregateRoot<ID>, ID>(
protected open var clazz: Class<TAggregateRoot>,
protected open var repository: IRepository,
protected open var deserializer: IObjectMapper,
override var logger: ILogger,
) : IService<ID> {
/**
* 删除对象前执行监听器。
*/
protected val beforeRemoveListeners = mutableMapOf<String, (id: TKey) -> Message>()
protected val beforeRemoveListeners = mutableMapOf<String, (id: ID) -> StatusMessage>()
/**
* 添加一个删除对象前执行监听器。
* @param key 监听器标志。
* @param func 监听方法。
*/
override fun addBeforeRemoveListener(key: String, func: (id: TKey) -> Message) {
override fun addBeforeRemoveListener(key: String, func: (id: ID) -> StatusMessage) {
this.beforeRemoveListeners[key] = func
}
@@ -49,23 +49,23 @@ open class Service<TAggregateRoot : IAggregateRoot<TKey>, TKey>(
this.beforeRemoveListeners.remove(key)
}
override fun add(command: ICommand): DataMessage<TKey> {
val msg = DataMessage<TKey>()
val root = this.convert(command)
override fun add(command: ICommand): DataMessage<ID> {
val msg = DataMessage<ID>()
val root = this.deserialize(command)
this.repository.add(root, this.clazz)
msg.data = root.id
return msg
}
override fun update(id: TKey, command: ICommand) {
val root = this.convert(command)
override fun update(id: ID, command: ICommand) {
val root = this.deserialize(command)
root.id = id
this.repository.update(root, this.clazz)
}
override fun remove(id: TKey) {
override fun remove(id: ID) {
val functions = this.beforeRemoveListeners.values
var msg: Message
var msg: StatusMessage
for (func in functions) {
msg = func(id)
if (!msg.success()) {
@@ -81,9 +81,9 @@ open class Service<TAggregateRoot : IAggregateRoot<TKey>, TKey>(
* @param command 需要转换的命令
* @return 聚合根
*/
protected open fun convert(command: ICommand): TAggregateRoot {
protected open fun deserialize(command: ICommand): TAggregateRoot {
try {
return converter.convert(command, this.clazz)
return deserializer.deserialize(command, this.clazz)
} catch (ex: Exception) {
throw RuntimeException("command not match aggregate root", ex)
}

View File

@@ -1,7 +1,7 @@
package com.synebula.gaea.domain.service
import com.synebula.gaea.data.message.DataMessage
import com.synebula.gaea.data.message.Message
import com.synebula.gaea.data.message.StatusMessage
import com.synebula.gaea.domain.model.IAggregateRoot
import com.synebula.gaea.domain.repository.IRepository
import com.synebula.gaea.log.ILogger
@@ -18,23 +18,23 @@ import com.synebula.gaea.log.ILogger
* @version 0.1
* @since 2020-05-17
*/
open class LazyService<TAggregateRoot : IAggregateRoot<TKey>, TKey>(
open class SimpleService<TAggregateRoot : IAggregateRoot<ID>, ID>(
protected open var clazz: Class<TAggregateRoot>,
protected open var repository: IRepository,
override var logger: ILogger
) : ILazyService<TAggregateRoot, TKey> {
override var logger: ILogger,
) : ISimpleService<TAggregateRoot, ID> {
/**
* 删除对象前执行监听器
*/
protected val beforeRemoveListeners = mutableMapOf<String, (id: TKey) -> Message>()
protected val beforeRemoveListeners = mutableMapOf<String, (id: ID) -> StatusMessage>()
/**
* 添加一个删除对象前执行监听器
* @param key 监听器标志
* @param func 监听方法
*/
override fun addBeforeRemoveListener(key: String, func: (id: TKey) -> Message) {
override fun addBeforeRemoveListener(key: String, func: (id: ID) -> StatusMessage) {
this.beforeRemoveListeners[key] = func
}
@@ -46,21 +46,21 @@ open class LazyService<TAggregateRoot : IAggregateRoot<TKey>, TKey>(
this.beforeRemoveListeners.remove(key)
}
override fun add(root: TAggregateRoot): DataMessage<TKey> {
val msg = DataMessage<TKey>()
override fun add(root: TAggregateRoot): DataMessage<ID> {
val msg = DataMessage<ID>()
this.repository.add(root, this.clazz)
msg.data = root.id
return msg
}
override fun update(id: TKey, root: TAggregateRoot) {
override fun update(id: ID, root: TAggregateRoot) {
root.id = id
this.repository.update(root, this.clazz)
}
override fun remove(id: TKey) {
override fun remove(id: ID) {
val functions = this.beforeRemoveListeners.values
var msg: Message
var msg: StatusMessage
for (func in functions) {
msg = func(id)
if (!msg.success()) {

View File

@@ -12,7 +12,7 @@ interface IQuery {
* @param id 对象Key。
* @return 视图结果
*/
fun <TView, TKey> get(id: TKey, clazz: Class<TView>): TView?
fun <TView, ID> get(id: ID, clazz: Class<TView>): TView?
/**
* 根据实体类条件查询所有符合条件记录

View File

@@ -0,0 +1,23 @@
package com.synebula.gaea.reflect
import com.synebula.gaea.bus.SubscriberRegistry
object Types {
/**
* 获取类的所有父类型。
*/
fun supertypes(clazz: Class<*>): Set<Class<*>> {
val supertypes = mutableSetOf<Class<*>>()
supertypes.add(clazz)
if (clazz.superclass != null)
supertypes.addAll(SubscriberRegistry.flattenHierarchy(clazz.superclass))
if (clazz.interfaces.isNotEmpty()) {
supertypes.addAll(clazz.interfaces.map { SubscriberRegistry.flattenHierarchy(it) }.reduce { r, c ->
val all = r.toMutableSet()
all.addAll(c)
all
})
}
return supertypes
}
}