设计与数据源无关的模型



我正在开发一个全栈Typescript应用程序,并尝试

  1. 保持所有模型和服务逻辑与任何备份数据源分离
  2. 保持数据和行为分离(即无方法模型(

但当涉及到关系时,我很难弄清楚如何设计这些模型。

现在我有一个core包,它导出一些接口

interface Item {
id: string;
text: string;
idProject: string;
}
interface Project {
id: string;
name: string;
idSource: string;
}
interface Source {
type: 'rss' | 'api';
name: string;
}
interface ItemService {
get(id: string): Promise<Item>
}
interface ProjectService {
get(id: string): Promise<Project>
}
interface SourceService {
get(id: string): Promise<Source>
}
interface ProjectItemLoaderService {
constructor();
loadItems(project: Project, source: Source): Promise<Item[]>;
}

然后在我的server包中,我像这个一样使用它们

get('/project/:idProject/items', ({ idProject }) => {
const project = projectService.get(idProject);
const source = sourceService.get(project.idSource);
const items = projectItemLoaderService.loadItems(project, source);
...
})

但从我读到的关于抽象模型(DDD,六边形架构(的主题来看,我的模型不应该通过ID来指代关系,而应该包括实际的模型,因为ID之类的东西是一个存储概念,而不是域概念。

interface Item {
id: string;
text: string;
project: Project
}
interface Project {
id: string;
name: string;
source: Source
}
interface Source {
type: 'rss' | 'api';
name: string;
}
...
interface ProjectItemLoaderService {
constructor();
loadItems(project: Project): Promise<Item[]>;
}
...
get('/project/:idProject/items', ({ idProject }) => {
const project = projectService.get(idProject);
// Project already includes the Source model, not need to load it
const items = projectItemLoaderService.loadItems(project);
...
})

这更方便,不必不断加载嵌套模型,但随着嵌套越来越深,它似乎很容易失控。Project模型实际上应该具有items: Item[]属性,这可能需要相当长的时间才能基于后备存储进行填充。然后它将是周期性的,这是另一个问题。

我基本上是在寻找关于建立数据不可知模型的任何建议,以及处理这些模型的服务应该如何访问其关系。也许在没有完整DDD(用例、命令等(的情况下做这种事情是不太可行的,我应该只使用源对ORM对象,但我确实喜欢将业务逻辑层与底层数据源解耦的想法。

首先:是的,最好有一个域对象的图,而不是带有id的映射。这更容易操作、理解和实现关系以及维护。

第二:您不能在应用程序中加载域的全部数据。当加载一个对象时,您不必加载整个依赖关系树。

  • 它会消耗内存
  • 加载不需要的信息需要很长时间
  • 并且会因为其他用户操作而很快过时

-->制作只加载页面或操作所需的对象和嵌套对象的服务

例如,对于一个列表,您通常只需要加载列表中的对象,但在详细信息页面上,您需要加载并显示关联的子对象,以增加1或2个深度级别。

(您稍后会考虑哪些数据可以经常重复使用,并使用缓存进行优化(

相关内容

最新更新