大家好,对于领域驱动设计开发来说我是一个新人,目前我在项目中强制自己实施领域驱动设计开发,为的是让自己能快速理解领域驱动设计并在开发中运用自如,但实际结果是处处都是问题,手里有两本书,但看了之后感觉问题更多,下面我问几个我目前最关心的问题,希望在此路上已有成就的道友能帮我一把。
1.领域驱动设计里的所说的Repository的概念是我们以前用的DAO概念吗?目前我在使用Spring的JPA来进行开发,里面有一个JPARepository的概念, 但我的理解JPARepository的概念就是以前所熟悉的DAO模式,但是就是不知道是否是领域驱动设计里所说的Repository的概念了。
2.聚合对象(或者聚合根对象,我也不知道这两个是不是一个东西)大概是一个什么样的对象,书里基本上都是讲概念而没什么例子,如果一个对象里有另一个对象的集合,而对另一个对象集合中添加删改都通过当前对象来操作,那么当前对象就是聚合根吗?
3.Model与Entity可以是一个东西吗?Model一般指的是领域模型对象,Entity一般指数据库中的实体对象,但就我以前的开发经验来看Entity肯定是贫血模型,而领域驱动中设计的Model对象肯定一本都不是贫血模型,另外书中有说Model是通过Repository取得,如果Model和Entity是一回事,那么Repository岂不是和DAO是一回事了吗?之所以提出这个问题在于,我现在应用的模型是Model为充血模型,而Model是从JPARepository中取得的,但JPARepository在基础架构层,而Model在领域层,这样层间的引用关系岂不是反过来了吗?虽然书上有说依赖倒置原则,但那是对接口而言,对于我这种情况肯定不是依赖倒置的问题啊。
4.在一本书里看到对于Repository的描述,其中一种是类似Hibernate那种,对于Hibernate我没用过太多,对它的理解也不是很透彻,但通过书中的描述我理解是通过Repository取出的Model后,其Model对象本身就能直接操作数据库,也就是对对象的任何修改都能直接更新数据库,不需要显示的再次调用Repository的save方法,与之对应的另一种模式就是显示调用Repository的save方法才能将Model的改动持久化到数据库中,那么无论采用那种模式,从这段描述中我觉得领域驱动中的Repository越来越像DAO了,如果我的理解不对,请道友指正。
5.最后一个问题是与我目前的项目相关的,根据六边形法则,接口层应该放置不同类型用户访问的接口,我的项目有两个接口,一个HTTP接口,提供Restful API给移动设备使用,另一个是Socket接口,提供字符流给一些单片机设备使用。Socket接口使用Netty组件来实现,Netty组件里已经封装了很多Socket的东西,但业务相关的东西还是需要自己来实现,但哪些是我需要放在基础架构层的,哪些是需要放在接口层的呢?我以前的做法是将关于Socket接口的全部代码都放在基础架构层,但看了六边形法则后我觉得Socket也是一种接口,只不过面向的不是移动设备而是单片机设备而已,那么问题是将哪一部分拿到接口层呢,目前我是将自己的业务实现写在继承ChannelDuplexHandler的类中,那么我感觉应该把关于业务实现的类拿到接口层中,不知道我想的对不对,请道友帮忙解惑。
以上是我在应用领域驱动设计与开发过程中遇到的问题,希望道友不吝赐教,谢谢。