hushawn
2011-12-30 15:55
如果按需要加载,那我的Repository不是要写不同的对象构建方法吗

如某时刻领域对象User只读取了Roles列表,过会儿又需要用员工Employee信息,User.Employee这个时候再去数据库读取User的相关Employee,不是推荐领域对象不直接访问Repository吗,领域对象应该跟技术无关是吗

public class User

{

public IList<Role> Roles { get; set; }

public Employee Employee

{

get

{

从数据库加载员工信息?

}

}

}

根据原理,user跟技术相关了,肯定不行的吧

那只能根据业务需要,在Repository提供不同的User对象构建方法了,有的方法是加载User的时候同时加载关联对象Roles ,有的方法就加载关联对象Employee,有的方法两个都加载,调用哪个根据不同业务需要来决定??老师是这样的吗

另外如果在Repository一次性全部读取关联对象,根据聚合原理,用户和员工不是聚合关系,不应该一起读取出来的,虽然可能用不到DDD,但是我觉得也要从DDD思路去考虑,老师我这样有啥问题,多谢指教

[该贴被hushawn于2011-12-30 16:19修改过]

banq
2011-12-31 07:49
2011年12月30日 15:55 "@hushawn"的内容
不是推荐领域对象不直接访问Repository吗,领域对象应该跟技术无关是吗 ...

先搞清楚技术和思想哪个脚步快,爱因斯坦提出相对论时,当时技术条件无法验证,DDD提出这样先进思想,如果你使用SQL这样旧的技术装备当然无法满足,至少要用Entity Framework这样框架吧。

下图是DDD + CQRS + Event Sourcing的.NET落地实现架构图:

[该贴被banq于2011-12-31 08:33修改过]


hushawn
2011-12-31 09:18
这个有点复杂,我只是把系统的分页查询还有些复杂的查询单独分离出个查询子系统,数据库还是同一个,直接用存储过程查询;

另外实体间的引用,我准备参考网上资料,聚合内部实体间用对象引用(强关联),非聚合间的弱关联用ID来引用,不用对象来引用;这应该可以吧,主要是领域那部分能适用需求的变化,我们的目的应该也就是这样,不要死死追求什么完全面向对象

另外,我看了资料服务分应用服务,还有领域服务,也看了领域服务的转帐例子描述,我上面说的ID关联,我这个根据ID获取ID所关联对象的方法,不知道要写在领域服务里,还是应用服务里??

banq
2011-12-31 09:29
2011年12月31日 09:18 "@hushawn"的内容
我这个根据ID获取ID所关联对象的方法 ...

不能为了OO而OO是对的,但是也不能超越OO的底线,采取数据库方式,这就是混乱了,这个底线就是:对象关联必须直接引用,不能在一个对象内部直接将另外一个对象ID作为自己的字段,以Java为例子:

Class A{

int bId; //B对象的Id

}

这是不可以的。必须如下:

Class A{

B a; //直接引用b;

}

至于你如何在A中将B加载出来,这是ORM底层框架的事情,采取一次性加载或懒加载都可以,jivejdon虽然也采取SQL,但是采取Jdon框架事件机制,是在getB()方法中进行懒加载,即用即加载。

当然以上原则不适用于CQRS中直接从数据库查询Query渠道。

hushawn
2011-12-31 09:44
有个延迟加载例子,只是用了.NET里的委托技术,来实现延迟加载

public class Article {

public int ArticleID { get; set; }

public int CategoryID { get; set; }

// 文章所属分类

protected ArticleCategory category;

public ArticleCategory Category

{

get

{

if (category == null)

{

if (CategoryLazyLoader != null)

{

category = CategoryLazyLoader(CategoryID);

}

else

{

category = null;

}

}

return category ;

}

}

// 文章分类延时加载器(委托)

public Func<int,Model.ArticleCategory>CategoryLazyLoader { get; set; }

}

本来 Category 属性是直接获取分类数据(Repository),这里通过在外边注册数据获取方法来实现,这种方法有没有违反领域对象的业务与技术分离的原理,一般原理是领域对象里不能调用Repository,这里知识通过委托间接调用了,有没违反这些原则???

另外,我在创建对象时候,用一个参数来确定是否延迟加载是否可以?

另外,聚合内的非聚合根子对象是否可以延迟加载???

另外,能否同时有引用ID和引用对象,因为,我要去延迟加载的时候,如果没ID,就不知道要加载哪个对象了???

Class A{

int bId; //B对象的Id

}

这是不可以的。必须如下:

Class A{

B b; //直接引用b;

int bId;

}

老师在吗?快帮忙下

[该贴被hushawn于2011-12-31 09:56修改过]

[该贴被hushawn于2011-12-31 10:35修改过]

[该贴被hushawn于2011-12-31 11:09修改过]

[该贴被hushawn于2011-12-31 11:11修改过]

猜你喜欢
6Go 上一页 1 2 3 4 5 6 下一页