eclipse Theia 文档-中文翻译(1-3)

749 阅读3分钟

服务与贡献

在本节中,我们将描述如何扩展如何使用其它扩展提供的服务,以及他们如何贡献到 Theia 工作台中。

依赖注入

Theia 使用 Inversify.js 依赖注入框架连接不同的组件。

依赖注入框架在创建依赖项时将组件解耦,在创造器中作为构造函数的参数注入。一个依赖注入容器,会根据你在启动时,通过容器模块提供的一些配置为你完成创建。

举个例子,导航组件需要访问文件系统展示文件树和文件夹树,使用依赖注入,导航组件的文件系统接口的具体实现并不那么重要。你可以放心的假定已经有一个与文件系统一致的对象可以使用。在 Theia 中,文件系统具体化的方法仅仅是一个代理向后端发送 JSON-RPC 消息,正因如此,它需要一些特殊的配置和处理。而导航器并不需要关心,因为它将被注入到一个完整运行文件系统实例中。

此外,这种构造和使用的分离,允许扩展提供他们非常具体的实现,例如文件系统(如果需要的话)。不过这仍然不需要与文件系统接口的任何用户进行交互。

依赖注入是Theia不可或缺的一部分。 因此,我们强烈建议至少学习Inversify.js的基础知识。

服务

服务需要绑定其他的组件,通过组件来调用服务。例如,一个扩展可以可以暴露“选择服务”,让其他扩展去注入实例来使用它。

Contribution-Points If an extension wants to provide a hook for others to contribute to, they should define a contribution-point. A contribution-point is just an interface that many others can implement. The extension will delegate to them when needed.

The OpenerService, for instance, defines a contribution point to allow others registering OpenHandlers. You can have a look at the code here.

Theia comes with an extensive list of contribution points already. A good way to see what contribution points exist is to do a find references on bindContributionProvider.

贡献点

如果一个插件想提供一个钩子给其他人,那么可以定义一个贡献点。一个贡献点就是一个其他所有人能实现的一个接口,插件会在需要使用贡献点时委托他们。

例如,开放服务,定义了一个贡献点允许其他人注册开放处理方法,你可以看下他具体的实现

theia 已经提供了一个广泛的贡献点清单。查看贡献点存在的一个好方法是查找bindContributionProvider上的引用。

贡献提供者

普遍来讲,一个贡献提供者通常会提供一个基础的容器,由贡献来实现绑定类型的实例。想给共享容器绑定一个类型,你可以这样做(来自 messaging-module.ts):

export const messagingModule = new ContainerModule(bind => {
    bind<BackendApplicationContribution>(BackendApplicationContribution).to(MessagingContribution);
    bindContributionProvider(bind, ConnectionHandler)
});

The last line will bind a ContributionProvider to one that contains all ConnectionHandler bound instances. It is used as such

最后一行将会把 ContributionProvider 绑定到包含所有 ConnectionHandler 的绑定实例。它是这样使用的 (来自 messaging-module.ts)

constructor( @inject(ContributionProvider) @named(ConnectionHandler) protected readonly handlers: ContributionProvider<ConnectionHandler>) {
    
}

这里我们注入了一个ContributionProvider,它带有之前由bindContributionProvider绑定的已命名的 ConnectionHandler 值。这使得任何人都可以绑定一个ConnectionHandler,现在当messagingModule启动时,所有的ConnectionHandler都将被启动。