DDD工厂方法注入的一种方式

每一个值对象有一个工厂方法用于注入所需的服务和数据,这里提供了一种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 {
    }
}

 

おすすめ

転載: blog.csdn.net/maoyeqiu/article/details/113761549
おすすめ