Chromium Keyed Service

Chromium的Profile继承自BrowserContext,代表着一个browser的上下文,很多浏览器很多业务类的代码都与此有着紧密的联系。以前很多业务类都写到Profile里面,导致Profile的代码越来越膨胀而难以维护。另外一个更严重的问题是:业务类之间的依赖关系越来越难以手动管理了,导致浏览器退出时,因为逻辑类生命周期的管理不当而引发崩溃。

为此Chromium引入了Profile Architecture 架构。把那些业务类都拆分一个个独立的KeyedService,它是由KeyedServiceFactory管理生命周期。而KeyedService之间的依赖关系则通过BrowserContextDependencyManager去管理。

SigninErrorController为例介绍一下Chromium的Keyed Service机制。

Keyed Service

SigninErrorControllerFactory是一个继承自KeyedServiceFactory的单例,它负责管理SigninErrorController生命周期。当它创建时,可以通过DependsOn方法来设定与其他业务类的依赖关系。具体维护依赖关系则是BrowserContextDependencyManager。它维护这依赖关系图,业务类销毁时,则生成相应的依赖关系,在PerformInterlockedTwoPhaseShutdown里面分两阶段来销毁KeyedService

  1. ShutdownFactoriesInOrder,它会根据依赖关系调用到对应的KeyedServiceShutdown方法
  2. ShutdownFactoriesInOrder,它会根据依赖关系调用到对应的KeyedService的析构函数

Keyed Service