Skip to content

Commit

Permalink
feat: support inject in lifecycle
Browse files Browse the repository at this point in the history
  • Loading branch information
hyj1991 committed Aug 1, 2022
1 parent 6945a13 commit 138e8fb
Show file tree
Hide file tree
Showing 15 changed files with 43 additions and 85 deletions.
6 changes: 3 additions & 3 deletions src/constant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,12 @@ export const EXCEPTION_FILENAME = 'exception.json';
export const DEFAULT_LOADER_LIST_WITH_ORDER = [
'exception',
'plugin-config',
'lifecycle-hook-unit',
'config',
'plugin-meta',
'module',
'framework-config',
'package-json',
'module',
'lifecycle-hook-unit',
'config',
];

export const DEFAULT_CONFIG_DIR = 'src/config';
Expand Down
14 changes: 3 additions & 11 deletions src/lifecycle/index.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
import { Constructable, Container } from '@artus/injection';
import { Application } from '../types';
import {
CONSTRUCTOR_PARAMS,
CONSTRUCTOR_PARAMS_APP,
CONSTRUCTOR_PARAMS_CONTAINER,
HOOK_NAME_META_PREFIX,
} from '../constant';

export type HookFunction = <T = unknown>(hookProps : {
export type HookFunction = <T = unknown>(hookProps: {
app: Application,
lifecycleManager: LifecycleManager,
payload?: T
}) => void|Promise<void>;
}) => void | Promise<void>;

export class LifecycleManager {
hookList: string[] = [
Expand Down Expand Up @@ -52,12 +49,7 @@ export class LifecycleManager {

registerHookUnit(extClazz: Constructable<any>) {
const fnMetaKeys = Reflect.getMetadataKeys(extClazz);
const constructorParams = Reflect.getMetadata(CONSTRUCTOR_PARAMS, extClazz) ?? [];
const paramsMap = {
[CONSTRUCTOR_PARAMS_APP]: this.app,
[CONSTRUCTOR_PARAMS_CONTAINER]: this.container,
};
const extClazzInstance = new extClazz(...constructorParams.map(param => paramsMap[param]));
const extClazzInstance = this.container.get(extClazz);
for (const fnMetaKey of fnMetaKeys) {
if (typeof fnMetaKey !== 'string' || !fnMetaKey.startsWith(HOOK_NAME_META_PREFIX)) {
continue;
Expand Down
1 change: 1 addition & 0 deletions src/loader/impl/lifecycle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class LifecycleLoader implements Loader {
async load(item: ManifestItem) {
const extClazz: Constructable<ApplicationLifecycle> = await compatibleRequire(item.path);
const lifecycleManager: LifecycleManager = this.container.get(ArtusInjectEnum.LifecycleManager);
this.container.set({ type: extClazz });
lifecycleManager.registerHookUnit(extClazz);
return extClazz;
}
Expand Down
13 changes: 5 additions & 8 deletions test/fixtures/app_koa_with_ts/src/app.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { DefaultContext } from 'koa';
import { Server } from 'http';
import { Container } from '@artus/injection';
import { Container, Inject } from '@artus/injection';
import { Context, Input } from '@artus/pipeline';

import { ArtusApplication } from '../../../../src';
import { LifecycleHookUnit, LifecycleHook, WithApplication, WithContainer } from '../../../../src/decorator';
import { ArtusApplication, ArtusInjectEnum } from '../../../../src';
import { LifecycleHookUnit, LifecycleHook } from '../../../../src/decorator';
import { ApplicationLifecycle } from '../../../../src/types';

import KoaApplication from './koa_app';
Expand All @@ -14,14 +14,11 @@ export let server: Server;

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;
@Inject()
container: Container;

constructor(@WithApplication() app: ArtusApplication, @WithContainer() container: Container) {
this.app = app;
this.container = container;
}

get koaApp(): KoaApplication {
return this.container.get(KoaApplication);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
import { Server } from 'http';
import { LifecycleHookUnit, LifecycleHook, WithApplication } from '../../../../../../../src/decorator';
import { LifecycleHookUnit, LifecycleHook } from '../../../../../../../src/decorator';
import { ApplicationLifecycle } from '../../../../../../../src/types';
import { ArtusApplication } from '../../../../../../../src';
import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../../../../src';
import Client, { MysqlConfig } from './client';

export let server: Server;

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;

constructor(@WithApplication() app: ArtusApplication) {
this.app = app;
}

@LifecycleHook()
async willReady() {
const mysql = this.app.container.get('ARTUS_MYSQL') as Client;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
import { Server } from 'http';
import { LifecycleHookUnit, LifecycleHook, WithApplication } from '../../../../../../../src/decorator';
import { LifecycleHookUnit, LifecycleHook } from '../../../../../../../src/decorator';
import { ApplicationLifecycle } from '../../../../../../../src/types';
import { ArtusApplication } from '../../../../../../../src';
import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../../../../src';
import Client, { MysqlConfig } from './client';

export let server: Server;

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;

constructor(@WithApplication() app: ArtusApplication) {
this.app = app;
}

@LifecycleHook()
async willReady() {
const mysql = this.app.container.get('ARTUS_MYSQL') as Client;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
import { Server } from 'http';
import { LifecycleHookUnit, LifecycleHook, WithApplication } from '../../../../../../../src/decorator';
import { LifecycleHookUnit, LifecycleHook } from '../../../../../../../src/decorator';
import { ApplicationLifecycle } from '../../../../../../../src/types';
import { ArtusApplication } from '../../../../../../../src';
import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../../../../src';
import Client, { RedisConfig } from './client';

export let server: Server;

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;

constructor(@WithApplication() app: ArtusApplication) {
this.app = app;
}

@LifecycleHook()
async willReady() {
const redis = this.app.container.get('ARTUS_REDIS') as Client;
Expand Down
12 changes: 4 additions & 8 deletions test/fixtures/custom_instance/bootstrap.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,18 @@
import {
ArtusApplication,
ApplicationLifecycle, LifecycleHookUnit, LifecycleHook,
WithApplication, WithContainer,
ApplicationLifecycle, LifecycleHookUnit, LifecycleHook, ArtusInjectEnum,
} from '../../../src/index';

import { Container } from '@artus/injection';
import { Container, Inject } from '@artus/injection';
import Custom from './custom';

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;
@Inject()
container: Container;

constructor(@WithApplication() app: ArtusApplication, @WithContainer() container) {
this.app = app;
this.container = container;
}

@LifecycleHook()
configDidLoad() {
this.container.set({ id: Custom, value: new Custom('foo') });
Expand Down
9 changes: 3 additions & 6 deletions test/fixtures/frameworks/bar/src/lifecycle.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
import { Server } from 'http';
import { LifecycleHookUnit, LifecycleHook, WithApplication } from '../../../../../src/decorator';
import { LifecycleHookUnit, LifecycleHook } from '../../../../../src/decorator';
import { ApplicationLifecycle } from '../../../../../src/types';
import { ArtusApplication } from '../../../../../src';
import { ArtusInjectEnum, ArtusApplication, Inject } from '../../../../../src';
import { registerController } from './/http';
import { HttpTrigger } from '../../abstract/foo';

export let server: Server;

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;

constructor(@WithApplication() app: ArtusApplication) {
this.app = app;
}

@LifecycleHook()
async didLoad() {
// register controller
Expand Down
9 changes: 3 additions & 6 deletions test/fixtures/frameworks/layer/foo/foo1/src/lifecycle.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
import http, { Server } from 'http';
import { LifecycleHookUnit, LifecycleHook, WithApplication } from '../../../../../../../src/decorator';
import { LifecycleHookUnit, LifecycleHook } from '../../../../../../../src/decorator';
import { ApplicationLifecycle } from '../../../../../../../src/types';
import { Input } from '@artus/pipeline';
import { ArtusApplication } from '../../../../../../../src';
import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../../../../src';

export let server: Server;

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;

constructor(@WithApplication() app: ArtusApplication) {
this.app = app;
}

@LifecycleHook()
willReady() {
const config = this.app.config ?? {};
Expand Down
9 changes: 3 additions & 6 deletions test/fixtures/frameworks/layer/foo/foo2/src/lifecycle.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
import http, { Server } from 'http';
import { LifecycleHookUnit, LifecycleHook, WithApplication } from '../../../../../../../src/decorator';
import { LifecycleHookUnit, LifecycleHook } from '../../../../../../../src/decorator';
import { ApplicationLifecycle } from '../../../../../../../src/types';
import { Input } from '@artus/pipeline';
import { ArtusApplication } from '../../../../../../../src';
import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../../../../src';

export let server: Server;

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;

constructor(@WithApplication() app: ArtusApplication) {
this.app = app;
}

@LifecycleHook()
willReady() {
const config = this.app.config ?? {};
Expand Down
9 changes: 3 additions & 6 deletions test/fixtures/trigger/event/app.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
import { EventEmitter } from 'events';
import { ArtusApplication } from '../../../../src';
import { LifecycleHookUnit, LifecycleHook, WithApplication } from '../../../../src/decorator';
import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../src';
import { LifecycleHookUnit, LifecycleHook } from '../../../../src/decorator';
import { Context, Input, Next } from '@artus/pipeline';
import { ApplicationLifecycle } from '../../../../src/types';

export const event = new EventEmitter();

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;

constructor(@WithApplication() app: ArtusApplication) {
this.app = app;
}

@LifecycleHook()
async didLoad() {
this.app.trigger.use(async (ctx: Context, next: Next) => {
Expand Down
9 changes: 3 additions & 6 deletions test/fixtures/trigger/http/app.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
import http, { Server } from 'http';
import { Context, Input } from '@artus/pipeline';
import { ArtusApplication } from '../../../../src';
import { LifecycleHookUnit, LifecycleHook, WithApplication } from '../../../../src/decorator';
import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../src';
import { LifecycleHookUnit, LifecycleHook } from '../../../../src/decorator';
import { ApplicationLifecycle } from '../../../../src/types';

export let server: Server;

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;

constructor(@WithApplication() app: ArtusApplication) {
this.app = app;
}

@LifecycleHook()
async didLoad() {
this.app.trigger.use(async (ctx: Context) => {
Expand Down
9 changes: 3 additions & 6 deletions test/fixtures/trigger/timer/app.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ArtusApplication } from '../../../../src';
import { LifecycleHookUnit, LifecycleHook, WithApplication } from '../../../../src/decorator';
import { ArtusApplication, Inject, ArtusInjectEnum } from '../../../../src';
import { LifecycleHookUnit, LifecycleHook } from '../../../../src/decorator';
import { Context, Input } from '@artus/pipeline';
import { ApplicationLifecycle } from '../../../../src/types';

Expand All @@ -17,12 +17,9 @@ export const execution = {

@LifecycleHookUnit()
export default class MyLifecycle implements ApplicationLifecycle {
@Inject(ArtusInjectEnum.Application)
app: ArtusApplication;

constructor(@WithApplication() app: ArtusApplication) {
this.app = app;
}

@LifecycleHook()
async didLoad() {
this.app.trigger.use(async (ctx: Context) => {
Expand Down
1 change: 0 additions & 1 deletion test/framework.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,5 @@ describe('test/framework.test.ts', () => {

await app.artus.close();
assert(!app.isListening());

});
});

0 comments on commit 138e8fb

Please sign in to comment.