Skip to content

Commit

Permalink
调整injector支持ModuleWithProviders
Browse files Browse the repository at this point in the history
  • Loading branch information
meepobrother committed Apr 25, 2019
1 parent e8f9ba0 commit 5bf2335
Show file tree
Hide file tree
Showing 8 changed files with 119 additions and 56 deletions.
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ services:
- 0.0.0.0:3306:3306
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: test
MYSQL_DATABASE: nger
volumes:
- ./data/mysql:/var/lib/mysql
- ./config/mysql/my.conf:/etc/mysql/my.conf
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"dependency-graph": "^0.8.0",
"fs-extra": "^7.0.1",
"gulp": "^4.0.1",
"mysql": "^2.17.1",
"reflect-metadata": "^0.1.13",
"rxjs": "^6.4.0",
"shelljs": "^0.8.3",
Expand Down
102 changes: 60 additions & 42 deletions packages/nger-core/lib/decorators/ngModule.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { makeDecorator, ClassContext, ClassAst, TypeContext, ConstructorContext } from 'ims-decorator';
import { makeDecorator, ClassContext, ClassAst, TypeContext, ConstructorContext, isType } from 'ims-decorator';
export const NgModuleMetadataKey = 'NgModuleMetadataKey';
import { InjectConstructorAst, InjectMetadataKey, InjectPropertyAst } from './inject'
import { Provider, Type, ModuleWithProviders, SchemaMetadata, Injector } from 'nger-di';
Expand All @@ -10,13 +10,13 @@ import { SelfConstructorAst } from './self';
import { OptionalConstructorAst } from './optional';
export interface NgModuleOptions {
providers?: Provider[];
declarations?: Array<Type<any> | any[]>;
imports?: Array<Type<any> | ModuleWithProviders<{}> | any[]>;
exports?: Array<Type<any> | any[]>;
entryComponents?: Array<Type<any> | any[]>;
declarations?: Array<Type<any>>;
imports?: Array<Type<any> | ModuleWithProviders<{}>>;
exports?: Array<Type<any>>;
entryComponents?: Array<Type<any>>;
// 这里是启动组件 也就是首页 前端有用
bootstrap?: Array<Type<any> | any[]>;
schemas?: Array<SchemaMetadata | any[]>;
bootstrap?: Array<Type<any>>;
schemas?: Array<SchemaMetadata>;
id?: string;
jit?: true;
}
Expand Down Expand Up @@ -98,6 +98,22 @@ export class NgModuleClassAst extends ClassContext<NgModuleOptions> {
if (def.exports) this.exports = this.forEachObjectToTypeContent(def.exports);
if (def.entryComponents) this.entryComponents = this.forEachObjectToTypeContent(def.entryComponents);
if (def.bootstrap) this.bootstrap = this.forEachObjectToTypeContent(def.bootstrap);
if (def.imports) {
def.imports.map(imp => {
if (isType(imp)) {
// type
return this.context.visitType(imp);
} else {
// ModuleWithProviders
const { ngModule, providers } = imp as ModuleWithProviders
const context = this.context.visitType(ngModule);
if (context && providers) {
providers.map(pro => this.handlerProvider(context.injector, pro));
}
return context;
}
})
}
if (def.imports) this._imports = this.forEachObjectToTypeContent(def.imports);
const injector = this.context.typeContext.injector;
if (def.exports) {
Expand Down Expand Up @@ -126,41 +142,7 @@ export class NgModuleClassAst extends ClassContext<NgModuleOptions> {
});
// 处理provider
if (def.providers) {
def.providers.map(pro => {
if (isTypeProvider(pro)) {
// 这里必须有上下级关系,保留
const ctx = this.context.visitType(pro);
let deps: any[] = [];
if (ctx) {
deps = handlerTypeContextToParams(ctx)
setAppInitializer(injector, ctx)
}
const proProvider: FactoryProvider = {
provide: pro,
useFactory: (...params: any) => new pro(...params),
deps: deps,
multi: false
}
injector.setStatic([proProvider]);
injector.setExport(pro);
} else if (isClassProvider(pro)) {
const ctx = this.context.typeContext.visitor.visitType(pro);
let deps: any[] = [];
if (ctx) {
deps = handlerTypeContextToParams(ctx)
setAppInitializer(injector, ctx)
}
const proProvider: StaticClassProvider = {
...pro,
deps: deps
}
injector.setStatic([proProvider]);
injector.setExport(pro.provide);
} else {
injector.setStatic([pro]);
injector.setExport(pro.provide);
}
});
def.providers.map(pro => this.handlerProvider(injector, pro));
}
// 当前ngModule注入
const typeContext = this.context.typeContext;
Expand All @@ -183,6 +165,42 @@ export class NgModuleClassAst extends ClassContext<NgModuleOptions> {
// 处理属性inject
injector.debug();
}

handlerProvider(injector: Injector, pro: Provider) {
if (isTypeProvider(pro)) {
// 这里必须有上下级关系,保留
const ctx = this.context.visitType(pro);
let deps: any[] = [];
if (ctx) {
deps = handlerTypeContextToParams(ctx)
setAppInitializer(injector, ctx)
}
const proProvider: FactoryProvider = {
provide: pro,
useFactory: (...params: any) => new pro(...params),
deps: deps,
multi: false
}
injector.setStatic([proProvider]);
injector.setExport(pro);
} else if (isClassProvider(pro)) {
const ctx = this.context.typeContext.visitor.visitType(pro);
let deps: any[] = [];
if (ctx) {
deps = handlerTypeContextToParams(ctx)
setAppInitializer(injector, ctx)
}
const proProvider: StaticClassProvider = {
...pro,
deps: deps
}
injector.setStatic([proProvider]);
injector.setExport(pro.provide);
} else {
injector.setStatic([pro]);
injector.setExport(pro.provide);
}
}
}
export function isNgModuleClassAst(ast: ClassAst): ast is ClassAst<NgModuleOptions> {
return ast.metadataKey === NgModuleMetadataKey;
Expand Down
3 changes: 2 additions & 1 deletion packages/nger-core/lib/orm/typeorm.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ClassAst, ClassContext, TypeContext } from 'ims-decorator';
import { ClassAst, ClassContext, TypeContext, makeDecorator } from 'ims-decorator';
export interface TypeormOptions {
/**
* 表
Expand All @@ -14,6 +14,7 @@ export interface TypeormOptions {
subscribers?: any[] | object;
}
export const TypeormMetadataKey = 'TypeormMetadataKey';
export const Typeorm = makeDecorator<TypeormOptions>(TypeormMetadataKey)
export function isTypeormClassAst(val: ClassAst): val is ClassAst<TypeormOptions> {
return val.metadataKey === TypeormMetadataKey;
}
Expand Down
33 changes: 25 additions & 8 deletions packages/nger-module-typeorm/README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,28 @@
# `nger-module-typeorm`

> TODO: description
> 使用typeorm
## Usage

```
const ngerModuleTypeorm = require('nger-module-typeorm');
// TODO: DEMONSTRATE API
```
## use
```ts
import {NgerModuleTypeorm} from 'nger-module-typeorm';
@NgModule({
imports: [NgerModuleTypeorm],
providers: [{
provide: TypeormToken,
useValue: ImsDemoTypeorm,
multi: true
},{
provide: TypeormOptionsToken,
useValue: {
type: 'mysql',
username: 'root',
password: '123456',
host: 'localhost',
port: 4200,
database: 'nger',
name: 'nger'
}
}]
})
export class ImsDemo{}
```
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<h2 align="center">用ng自由组合开发小程序</h2>

> 项目名称意义,用ng的人!I am a nger!
> 项目名称意义,用ng的人!I am a nger! Warning!Warning!Warning! 这不是一个前端项目。
vue、react相继都有了小程序的开发框架,作为一个nger,也该为社区做点事情了!
很遗憾,由于ng和小程序的差异性,我们暂时没打算直接把ng项目转换成小程序,而是用ng的一套思想(`依赖注入``装饰器`等)来规范开发小程序!以达到一套代码多平台运行。
Expand Down
23 changes: 21 additions & 2 deletions src/server.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,34 @@
import { NgModule, OnInit, Inject, OnError } from 'nger-core';
import { NgModule, OnInit, Inject, OnError, TypeormToken, TypeormOptionsToken } from 'nger-core';
import { HomeController, UserController } from './inc';
import { NgerModulePm2 } from 'nger-module-pm2';
import { Logger } from 'nger-logger';
import { NgerModuleTypeorm } from 'nger-module-typeorm'
import { NgerRunnerTypeorm } from './typeorm'
/** api服务 */
@NgModule({
declarations: [
HomeController,
UserController
],
providers: [],
providers: [
{
provide: TypeormToken,
useValue: NgerRunnerTypeorm,
multi: true
},
{
provide: TypeormOptionsToken,
useValue: {
type: 'mysql',
username: 'root',
password: '123456',
host: 'localhost',
port: 3306,
database: 'nger',
name: 'nger'
}
}
],
imports: [
NgerModulePm2,
NgerModuleTypeorm
Expand Down
9 changes: 8 additions & 1 deletion src/typeorm/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,8 @@
export * from './entities'
export * from './entities'
import * as entities from './entities'
import { Typeorm } from 'nger-core';

@Typeorm({
entities: entities
})
export class NgerRunnerTypeorm { }

0 comments on commit 5bf2335

Please sign in to comment.