Skip to content

Commit 2ce348b

Browse files
committed
feat: 通过container收集依赖
1 parent 1cc76fd commit 2ce348b

File tree

8 files changed

+47
-16
lines changed

8 files changed

+47
-16
lines changed

packages/ioc/src/inject.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import { logger } from '@kever/logger'
2-
import { construct, defineProperty, Container } from '@kever/shared'
3-
import { InstanceType, Tag } from './utils'
2+
import {
3+
construct,
4+
defineProperty,
5+
Container,
6+
Tag,
7+
InstanceType,
8+
poolContainer,
9+
isBoolean,
10+
} from '@kever/shared'
411

512
const injectContainer = new Container<Tag, InstanceType>()
613

@@ -42,6 +49,10 @@ export const Inject =
4249
}
4350
value = construct(instance, parameter)
4451
}
45-
defineProperty(target, propertyKey, value)
52+
let pool = poolContainer.use(target)
53+
if (isBoolean(pool)) {
54+
pool = new Container<PropertyKey, unknown>()
55+
}
56+
pool.bind(propertyKey, value)
4657
})
4758
}

packages/ioc/src/middleware/middleware.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ import { MType, BaseMiddleware, Aop, KoaMiddleware } from './constants'
33
import { logger } from '@kever/logger'
44
import {
55
construct,
6-
defineProperty,
76
META_MIDDLEWARE_ALL,
87
META_MIDDLEWARE_GLOBAL,
98
META_MIDDLEWARE_ROUTER,
109
Container,
10+
Tag,
11+
poolContainer,
12+
isBoolean,
1113
} from '@kever/shared'
1214
import { middlewarePatchPool } from './patch'
13-
import { isPromise, Tag } from '../utils'
15+
import { isPromise } from '../utils'
1416

1517
export const middlewareGlobalContainer = Object.create({})
1618
export const middlewareAllContainer = Object.create({})
@@ -37,7 +39,11 @@ const propertyMiddleware =
3739
logger.error(`${tag.toString()} type property middleware no exists`)
3840
return
3941
}
40-
defineProperty(target, propertyKey, middleware)
42+
let pool = poolContainer.use(target)
43+
if (isBoolean(pool)) {
44+
pool = new Container<PropertyKey, unknown>()
45+
}
46+
pool.bind(propertyKey, middleware)
4147
})
4248
}
4349

packages/ioc/src/utils/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
1-
export * from './types'
2-
31
export const isPromise = <T>(object: T) =>
42
Object.prototype.toString.call(object).slice(8, -1) === 'Promise'

packages/shared/src/construct.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
1-
export const instancePool = new Map<Object, Object>()
1+
import { Container } from './container'
2+
import { isBoolean } from './type'
3+
4+
export const poolContainer = new Container<
5+
Object,
6+
Container<PropertyKey, unknown>
7+
>()
28

39
export const construct = (target: Function, params: unknown[] = []) => {
410
const instance = Reflect.construct(target, params)
5-
instancePool.set(target.prototype, instance)
11+
const instanceContainer = poolContainer.use(target.prototype)
12+
if (!isBoolean(instanceContainer)) {
13+
for (let [key, value] of instanceContainer.getPool().entries()) {
14+
defineProperty(instance, key, value)
15+
}
16+
}
617
return instance
718
}
819

@@ -11,9 +22,7 @@ export const defineProperty = (
1122
propertyKey: PropertyKey,
1223
value: unknown
1324
) => {
14-
const instance = instancePool.get(target)
15-
16-
Object.defineProperty(instance ? instance : target, propertyKey, {
25+
Object.defineProperty(target, propertyKey, {
1726
value,
1827
writable: false,
1928
enumerable: false,

packages/shared/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
export * from './metakey'
22
export * from './construct'
33
export * from './container'
4+
export * from './types'
5+
export * from './type'

packages/shared/src/metakey.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
// middleware
2-
export const META_MIDDLEWARE_GLOBAL = Symbol.for('ioc#middleware_global')
3-
export const META_MIDDLEWARE_ALL = Symbol.for('ioc#middleware_all')
4-
export const META_MIDDLEWARE_ROUTER = Symbol.for('ioc#middleware_router')
2+
export const META_MIDDLEWARE_GLOBAL = Symbol.for('meta#middleware_global')
3+
export const META_MIDDLEWARE_ALL = Symbol.for('meta#middleware_all')
4+
export const META_MIDDLEWARE_ROUTER = Symbol.for('meta#middleware_router')
5+
6+
// inject property
7+
export const META_INJECT_PROPERTY = Symbol.for('meta#inject_property')

packages/shared/src/type.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const isBoolean = (value: any): value is boolean =>
2+
typeof value === 'boolean'
File renamed without changes.

0 commit comments

Comments
 (0)