| name | lumina_domain_model |
| description | Use this skill when designing domain entities, creating business logic, or implementing domain methods. This skill enforces domain-driven design principles with simplified implementation, ensuring business logic is encapsulated in domain entities. |
Lumina 领域模型实践规范
功能概述
本技能包用于确保 Lumina 框架项目的领域模型设计符合规范,包括实体设计、业务方法封装、值对象使用等。
领域实体设计
简单场景(推荐)
@Data
public class Agent {
private Long agentId;
private String agentName;
private AgentType agentType;
private AgentStatus status;
public TaskResult executeTask(Task task) {
if (!this.canExecute()) {
throw new AgentCannotExecuteException("Agent当前状态无法执行任务");
}
return task.execute(this);
}
public boolean canExecute() {
return status == AgentStatus.ACTIVE;
}
public void activate() {
if (this.status == AgentStatus.ACTIVE) {
throw new IllegalStateException("Agent已经是激活状态");
}
this.status = AgentStatus.ACTIVE;
}
public void deactivate() {
if (this.status == AgentStatus.INACTIVE) {
throw new IllegalStateException("Agent已经是停用状态");
}
this.status = AgentStatus.INACTIVE;
}
}
复杂场景(可选)
@Value
public class AgentName {
private final String value;
public AgentName(String value) {
if (StringUtils.isBlank(value)) {
throw new IllegalArgumentException("Agent名称不能为空");
}
if (value.length() > 100) {
throw new IllegalArgumentException("Agent名称长度不能超过100");
}
this.value = value;
}
}
@Data
public class Agent {
private AgentId agentId;
private AgentName agentName;
private AgentType agentType;
private AgentStatus status;
}
业务服务设计
@Service
@Transactional
public class AgentService {
private final AgentMapper agentMapper;
private final AgentConverter agentConverter;
public AgentVO createAgent(CreateAgentDTO dto) {
AgentDO existingAgent = agentMapper.selectOne(
new LambdaQueryWrapper<AgentDO>()
.eq(AgentDO::getAgentName, dto.getAgentName())
.eq(AgentDO::getDeleted, 0)
);
if (existingAgent != null) {
throw new BusinessException("Agent名称已存在");
}
Agent agent = new Agent();
agent.setAgentName(dto.getAgentName());
agent.setAgentType(AgentType.valueOf(dto.getAgentType()));
agent.setStatus(AgentStatus.INACTIVE);
AgentDO agentDO = convertToDO(agent);
agentMapper.insert(agentDO);
agent.setAgentId(agentDO.getAgentId());
return convertToVO(agent);
}
public TaskResult executeTask(Long agentId, ExecuteTaskDTO dto) {
AgentDO agentDO = agentMapper.selectById(agentId);
if (agentDO == null || agentDO.getDeleted() == 1) {
throw new NotFoundException("Agent不存在");
}
Agent agent = convertToDomain(agentDO);
Task task = new Task();
task.setTaskName(dto.getTaskName());
task.setTaskConfig(dto.getTaskConfig());
TaskResult result = agent.executeTask(task);
return result;
}
}
转换器设计(可选)
@Component
public class AgentConverter {
public AgentDO toDO(Agent agent) {
if (agent == null) {
return null;
}
AgentDO agentDO = new AgentDO();
agentDO.setAgentId(agent.getAgentId());
agentDO.setAgentName(agent.getAgentName());
agentDO.setAgentType(agent.getAgentType().getValue());
agentDO.setStatus(agent.getStatus().getValue());
return agentDO;
}
public Agent toDomain(AgentDO agentDO) {
if (agentDO == null) {
return null;
}
Agent agent = new Agent();
agent.setAgentId(agentDO.getAgentId());
agent.setAgentName(agentDO.getAgentName());
agent.setAgentType(AgentType.valueOf(agentDO.getAgentType()));
agent.setStatus(AgentStatus.valueOf(agentDO.getStatus()));
return agent;
}
}
DO 和 Domain 合并使用(可选)
@Data
@TableName("lumina_agent")
public class Agent {
@TableId(value = "agent_id", type = IdType.AUTO)
private Long agentId;
@TableField("agent_name")
private String agentName;
public boolean canExecute() {
return status == 1;
}
public void activate() {
this.status = 1;
}
}
核心原则
- 业务逻辑封装在 Domain 中 - Entity 包含业务方法和业务规则
- Domain 不依赖其他层 - 保持领域模型的纯净
- 简单场景优先 - 直接使用基本类型,无需 Value Object
- Converter 可选 - 简单场景直接转换,复杂场景使用 Converter
使用场景
- 设计领域实体时,确保业务逻辑封装在实体中
- 创建业务服务时,确保调用领域方法而非直接操作
- 代码审查时,检查业务逻辑是否在正确的位置
- 重构代码时,确保领域模型保持纯净
检查清单
可用资源
references/domain-design-principles.md: 领域设计原则
examples/simple-entity.java: 简单场景实体示例
examples/complex-entity.java: 复杂场景实体示例
examples/service-usage.java: Service 使用示例