https://blog.ark.io/lets-explore-core-part-3-kernel-services-2836756675bd
Brian Faust
Давайте исследуем ARK Core: часть 3 - ядро и сервисы.
Это третья часть серии статей Let Let's Explore ARK Core, в которой описывается разработка следующего основного релиза ARK Core, а также некоторые советы и рекомендации о том, как начать вносить свой вклад и создавать свою идею сегодня.
Вступление
В первой и второй частях этой серии мы дали приблизительный обзор , как была обновлена базовая инфраструктура и процесс начальной загрузки приложений. Сегодня мы узнаем, какие сервисы внутри ARK Core, почему они были внедрены и как они поддерживают работу ARK Core.
Что такое сервис?
Прежде чем начать, мы должны подготовить почву, определив, что такое сервис внутри ARK Core. Проще говоря, сервис - это автономная функция, которая предоставляет лишь небольшую часть всей логики, составляющей ядро. Например, служба журналов, служба кэширования, служба базы данных, служба транзакций и т. д. - все они являются важными строительными блоками Core и должны легко изменяться, обслуживаться и тестироваться.
Почему были введены сервисы?
Сервисы на самом деле не все новые в Core 3.0, а скорее доработки того, как некоторые плагины работают в Core 2.0. В Core 2.0 была одна серьезная проблема, возникшая в результате позднего внедрения системы контейнеров и плагинов, она была настолько сильно фрагментирована, что потребовались плагины для таких функций, как регистраторы. Вы всегда должны будете включать эти плагины при сборке Core вместо того, чтобы они были частью единого пакета, который вам требуется.
Как были внедрены сервисы?
В Core 3.0 мы представили новый пакет под названием core-kernel, который представляет собой объединение различных пакетов, которые ранее существовали в Core 2.0. Примерами могут быть core-container, core-logger, core-event-emitter и другие
Пакет core-kernel является ядром Core 3.0 с целью устранения многих болевых точек по сравнению с предыдущими версиями, улучшения DX, сокращения шаблонов для разработчиков пакетов и, наконец, уменьшения фрагментации, от которой страдает Core 2.0.
Часть core-kernel - это каталог сервисов, который поставляется с множеством готовых сервисов, чтобы уменьшить размер шаблона, необходимый для разработки новых пакетов, и уменьшить дублирование в существующих.
-Actions
-Cache
-Config
-Events
-Filesystem
-Log
-Mixins
-Queue
-Schedule
-Validation
Мы подробнее рассмотрим эти службы в следующей части этой серии.
Регистрация ваших собственных сервисов
Регистрация ваших собственных сервисов настолько проста, насколько это возможно, и занимает всего несколько строк кода, которые выходят из коробки для разработчиков пакетов. Давайте сначала взглянем на ServiceProvider, который поставляется с Core, чтобы уменьшить необходимый шаблон для регистрации сервисов.
@injectable()
export abstract class ServiceProvider {
/**
* The application instance.
*/
@inject(Identifiers.Application)
protected readonly app: Kernel.Application;
/**
* The application instance.
*/
private packageConfiguration: PackageConfiguration;
/**
* The loaded manifest.
*/
private packageManifest: PackageManifest;
/**
* Register the service provider.
*/
public abstract async register(): Promise;
/**
* Boot the service provider.
*/
public async boot(): Promise{
//
}
/**
* Dispose the service provider.
*/
public async dispose(): Promise{
//
}
/**
* Get the manifest of the service provider.
*/
public manifest(): PackageManifest {
return this.packageManifest;
}
/**
* Set the manifest of the service provider.
*/
public setManifest(manifest: PackageManifest): void {
this.packageManifest = manifest;
}
/**
* Get the name of the service provider.
*/
public name(): string | undefined {
if (this.packageManifest) {
return this.packageManifest.get("name");
}
return undefined;
}
/**
* Get the version of the service provider.
*
* @returns {string}
* @memberof ServiceProvider
*/
public version(): string | undefined {
if (this.packageManifest) {
return this.packageManifest.get("version");
}
return undefined;
}
/**
* Get the configuration of the service provider.
*/
public config(): PackageConfiguration {
return this.packageConfiguration;
}
/**
* Set the configuration of the service provider.
*/
public setConfig(config: PackageConfiguration): void {
this.packageConfiguration = config;
}
/**
* Get the configuration defaults of the service provider.
*/
public configDefaults(): JsonObject {
return {};
}
/**
* Get the configuration schema of the service provider.
*/
public configSchema(): object {
return {};
}
/**
* Get the dependencies of the service provider.
*/
public dependencies(): Kernel.PackageDependency[] {
return [];
}
/**
* Enable the service provider when the given conditions are met.
*/
public async enableWhen(): Promise{
return true;
}
/**
* Disable the service provider when the given conditions are met.
*/
public async disableWhen(): Promise{
return false;
}
/**
* Determine if the package is required, which influences how bootstrapping errors are handled.
*/
public async required(): Promise{
return false;
}
}