大家好:
假设存在一个领域实体School,它是一个聚合跟,除了基本信息外,它还包含班级列表,班级里又有学生,结构大概如下:
{
"SchoolName": "大连工业大学",
"Address": "大连",
"Class": [{
"ClassName": "计算机031",
"Students": ["王五", "李四"]
},
{
"ClassName": "计算机032",
"Students": ["王五六", "李四一"]
}
]
}
假设现在有一个需求,要在前段UI上展示学校列表,那我在领域模型里应该如何读取School实体呢,是不是从Repository里面获得N个School实体,每个实体里都完整的,包括班级和学生? 这样的话会造成不必要的数据库读取操作。
如果我只读取School的基本信息,而不读取里面的班级和学生的话,是不是要定义另一个实体LightSchool,这样的话岂不是一个概念对应了两个领域模型
或者是我定义一个SchoolDto,里面只包含School的基本信息,从Repository里面直接构造Dto?
又或者是我专门在写一个数据库操作层,直接得到Dto,而Repository专门负责得到完整得领域模型?
想请教各位在DDD实践中是如何处理这样的问题的,谢谢!
建议试试 CQRS,业务查询这类没有副作用的操作可以不用在乎 DDD 的限制,怎么方便怎么来就好了。
eShopOnContainer 里就是直接 sql 语句查询的:https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs
谢谢,我看一下
我现在的做法是新建一个实体,虽然有时候自己都会乱。前端需要什么数据就只给什么数据,别想从我这里多拿一个字段。
这种只是显示详细列内页才用到这个所有数据用这个School...
EF分延迟加载和立即加载,延迟加载前端要什么数据才去查询,立即加载就会把所有关联数据一起查出来。
如果数据很多可以.Select(new{列显想要的字段})
你是说跳过领域类吗?不实例化领域类?
@会长: 为啥一直要强调DDD,模式是固定的,你开发一个东西为啥要强制用这样的方式,如果你有需要就再建一个SchoolVo或者叫SchoolView...
@为乐而来: SchoolView这个办法不错