每一个值对象有一个工厂方法用于注入所需的服务和数据,这里提供了一种DDD中工厂方法注入服务的方式,值对象有四个组成部分
1. 属性:标记业务含义
2. 方法:操作值域对象,进行业务操作。
3. 工厂:用来注入值对象所需的服务,静态类先初始化空服务,再Autowired实例化服务,这样就可以在对象中使用各种服务,对对象本身进行操作了。比如:人构造完成后就可以生活和工作了。
4. 上下文:使用Context来分离数据和服务
对象
@Getter
@Setter
public class Person extends Entity<Person.Context> {
private String id;
private String name;
private Date birthDay;
private String address;
private Person(Context context) {
super(context);
}
/**
* 保存信息
*/
public Object write(String id) {
return new Object();
}
/**
* 获取信息,填充当前对象
*/
public void read(String id) {
}
/**
* 填充对西那个
*/
public void fillValue(Person person) {
BeanUtils.copyProperties(person, this);
}
/**
* 其他一些方法
*/
public void otherMethod(){
}
/**
* 借助工厂实现依赖注入
*/
@Component
public static class Factory implements Entity.Factory {
private static Context context = new Context();
public static Person make() {
return new Person(context);
}
@Autowired
private void setFamilyService(FamilyService familyService) {
context.familyService = familyService;
}
@Autowired
private void setLifeService(LifeService lifeService) {
context.lifeService = lifeService;
}
@Autowired
private void setWorkService(WorkService workService) {
context.workService = workService;
}
}
/**
* 使用Context来分离数据和服务
*/
static class Context implements Entity.Context {
private FamilyService familyService;
private LifeService lifeService;
private WorkService workService;
}
}
实体模版
/**
* 实体模板
*
* @param <C>
*/
public abstract class Entity<C extends Entity.Context> {
private transient C _ctx; // 上下文
protected Entity(C context) {
this._ctx = context;
}
protected C ctx() {
return _ctx;
}
public interface Factory {
}
public interface Context {
}
}