为什么我们不能在 Ionic 中建立循环依赖?



在Ionic I中提供了两项服务来提供数据

export class DocumentService {
constructor(favorisService: FavorisService) { }
async GetById(id: number): Promise<DocumentModel>{
let path = this.favorisService.getPath();
// Get document's additionnal datas from BDD
// Gets back document depending on path
}
async GetById(id: number): Promise<DocumentModel>{
//request server and sends back a document
}
}
export class FavorisService {
constructor(httpServer: httpServerService) { }
async Synchronize(id: number): Promise<FavorisModel>{
//if favoris was never synchronized, get document on server
//then downloads document with document.getDocument
}
GetPathToDocument(){//returns favoris's document's path}
}

我不明白为什么我不能导入收藏夹服务在文档中服务和文档服务在收藏夹服务中,服务的目的是提供数据,为什么他们不能互相提供数据?

我做了第三项服务,名为FavorisDocumentService

export class FavorisDocumentService{
constructor(
httpServer: httpServerService, favorisService: FavorisService,
documentService: DocumentService
) { }
async GetById(id: number): Promise<FavorisModel>{
this.favoris = await this.favorisService.getById(id);
this.favoris.document = await this.documentService.getById(id);
}
}

问题不是它不起作用(实际上它起作用(,问题是我必须为每个组合或对象制作另一个服务。我之所以这么做,是因为我的项目规模较小,而且我只有两个关系,这迫使我创建了第三个服务,但现在我必须制作"DocumentFavorisUserServices"和其他。。。(在我的例子中,你可以说我只是把documentService放在了favorsService中,但有时我需要favorsServices放在documentService中(

不允许做"循环依赖"的目的是什么?正确的方法是什么?(我使用Ionic 4(

编辑----

收藏夹可以包含一个文档,但文档并不总是链接到收藏夹,而且根据收藏夹的不同,此文档可以存放在不同的位置,具体取决于收藏夹的管理方式。因此,"路径"数据位于收藏夹内部,而不在文档中。这就是为什么有时我需要文档中的收藏夹,因为当我有了"getdocument"(我放在documentservice中(时,我需要该文档的路径(以便将其取回(。在这种情况下,单一责任原则有点模糊了哪个对象有哪个责任(我对我的对象示例进行了编辑(

我认为你的做法不对。FavorisService应该只获得"收藏夹",而DocumentService应该只忙于处理文档。这些对象有彼此的键,这不应该改变。如果您的组件中需要来自这两个服务的数据,则应该从这两个服务器进行查询。如果你经常这样做,你可以制作一个包装器服务来为你做这件事(就像你做的那样(

尽量让您的服务只有一项责任,和/或重组没有循环引用的数据对象结构。

Ionic中不允许循环依赖关系的原因是,这在ES5中是不允许的。

您在代码中引用的越多,测试就越困难,理解也就越复杂——您最终会得到意大利面条式的代码。此外,许多引用会创建循环依赖关系,这会直接导致错误。

在ES6中,这在某种程度上是解决的,但我认为你永远不应该有循环依赖关系(请参阅上面的引号(。

最新更新