关于DDD学习过程中的一些疑问

12-05-21 babyba2009
目前DDD关于概念,设计思想讨论了比较多。但在编码过程中还是涉及到了一些问题:

实体类中如果有个值对象的列表,那我要获取这个列表应该怎么做?

如账户实体中的角色列表: List<Role> getRoles();

a. 一种方式在实体中注入RoleRepository, 直接调用 roleRepository.getRoles(accountId)

b. 另一种是通过setRoles(roles)赋值。

问题1: 第一种方式,如果这个实体是从数据库中获得的,如何注入RoleRepository?

问题2: 如果通过setRoles(roles)赋值,那我要获得账户列表是不是要在AccountRepository 中去遍历一遍。因为这里涉及的数据有层次关系了。

也就是说 实体中嵌套值对象或实体时,应该如何组装这个实体(我用的是ibatis+mySQL做为数据存储)?

                   

4
gameboyLV
2012-05-22 09:42
实体Entity中包含了若干组数据对象POJO的集合,所以要在实体中返回List<Role>,直接用实体调用DAO就行了,不用和Repository打交道

Repository是实体Entity的仓储,不是数据对象POJO的仓储

babyba2009
2012-05-22 09:51
通常实体调用DAO,可以在实体中注入DAO的接口,这个Spring中很好实现。我现在的问题是如果这个实体是由ibatis返回的,那这个实体中的DAO应该是为null的。

所以我在考虑构建一个复杂的实体如何做?

babyba2009
2012-05-22 10:01
// role实体
public class Role implements Serializable {

	/** Serial version UID required for safe serialization. */
	private static final long serialVersionUID = -5811523801082269593L;

	private Integer id;

	private String name;

	private String description;

	private Set<Permission> permissions = new HashSet<Permission>();

	private PermissionRepository	permissionRepository;

	public Role(PermissionRepository permissionRepository) {
		this.permissionRepository = permissionRepository;
	}

       // ..... gets,sets 忽略

	/**
	 * @[author]return[/author] the permissions
	 */
	public Set<Permission> getPermissions() {
		[author]return[/author] new HashSet<Permission>(this.permissionRepository.listPermissions(this.id));
	}

	/**
	 * @param permissions the permissions to set
	 */
	public void setPermissions(Set<Permission> permissions) {
		if (permissions != null)
			this.permissions = permissions;
	}

	public void addPermission(Permission permission) {
		if (permission != null)
			this.permissions.add(permission);
	}

	public boolean containsPermission(Permission permission) {
		[author]return[/author] this.permissions.contains(permissions);
	}
}

// ====== == Role 仓储
public class RoleRepositoryImpl extends GeneraliBatisSupport<Role> implements RoleRepository {

	@Override
	public List<Role> listRoles(Integer accountId) {
		[author]return[/author] getSqlMapClientTemplate().queryForList("Role.LISTALL", accountId);
	}

}
<p>

listRoles 返回的对象应该就是实体,但遍历出来的Role是没有注入permissionRepository 的。也就是直接调用role.getPermissions()方法会返回空指针

[该贴被babyba2009于2012-05-22 10:06修改过]

gameboyLV
2012-05-22 10:08
我是这样解决的,DAO<T>继承DAOBase

DAO<T> 是操作指定POJO的,比如dao.getInfo()

DAOBase 可以操作所有的POJO,比如dao.getInfo<T>()

如果在实体中要访问复杂的数据,直接用DAOBase就行了

猜你喜欢
3Go 1 2 3 下一页