@amriogit/injector 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -0
- package/package.json +12 -3
package/README.md
CHANGED
|
@@ -71,6 +71,87 @@ useProvide(UserService, MockUserService)
|
|
|
71
71
|
- **生命周期** — `onInit()` 钩子在依赖就绪后调用
|
|
72
72
|
- **SSR 兼容** — 无 DOM 依赖,InjectionToken 可序列化
|
|
73
73
|
|
|
74
|
+
## 生命周期
|
|
75
|
+
|
|
76
|
+
### onInit — 初始化
|
|
77
|
+
|
|
78
|
+
`onInit()` 在 Service 构造完成、所有 `$inject()` 依赖就绪后自动调用。不要在构造函数中做初始化逻辑。
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import { BaseService } from '@amriogit/injector'
|
|
82
|
+
|
|
83
|
+
class TimerService extends BaseService {
|
|
84
|
+
private logger = this.$inject(LoggerService)
|
|
85
|
+
private intervalId?: ReturnType<typeof setInterval>
|
|
86
|
+
|
|
87
|
+
state = reactive({ ticks: 0 })
|
|
88
|
+
|
|
89
|
+
onInit() {
|
|
90
|
+
// 依赖已就绪,可以安全使用 this.logger
|
|
91
|
+
this.intervalId = setInterval(() => {
|
|
92
|
+
this.state.ticks++
|
|
93
|
+
this.logger.log(`tick ${this.state.ticks}`)
|
|
94
|
+
}, 1000)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### onDestroy — 清理
|
|
100
|
+
|
|
101
|
+
`onDestroy()` 在 Service 被销毁时调用,用于清理定时器、取消订阅、关闭连接等。
|
|
102
|
+
|
|
103
|
+
触发方式:
|
|
104
|
+
|
|
105
|
+
- **`injector.destroy(Token)`** — 销毁指定 Service 实例
|
|
106
|
+
- **`injector.reset()`** — 销毁所有 Service 实例
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
import { BaseService, Injector, InjectionToken } from '@amriogit/injector'
|
|
110
|
+
|
|
111
|
+
// WebSocket 连接示例
|
|
112
|
+
class ConnectionService extends BaseService {
|
|
113
|
+
private ws?: WebSocket
|
|
114
|
+
|
|
115
|
+
connect = (url: string) => {
|
|
116
|
+
this.ws = new WebSocket(url)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
onDestroy() {
|
|
120
|
+
this.ws?.close()
|
|
121
|
+
this.ws = undefined
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// 定时器清理示例
|
|
126
|
+
class PollingService extends BaseService {
|
|
127
|
+
private timer?: ReturnType<typeof setInterval>
|
|
128
|
+
|
|
129
|
+
onInit() {
|
|
130
|
+
this.timer = setInterval(() => this.poll(), 5000)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private poll = () => { /* ... */ }
|
|
134
|
+
|
|
135
|
+
onDestroy() {
|
|
136
|
+
clearInterval(this.timer)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const injector = new Injector()
|
|
141
|
+
|
|
142
|
+
const polling = injector.inject(PollingService)
|
|
143
|
+
|
|
144
|
+
// 需要替换实现时,先销毁旧实例
|
|
145
|
+
injector.destroy(PollingService)
|
|
146
|
+
// polling.onDestroy() 已调用,定时器已清理
|
|
147
|
+
// 下次 inject(PollingService) 返回新实例
|
|
148
|
+
|
|
149
|
+
// 或者一次性清理所有
|
|
150
|
+
injector.reset()
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
`onDestroy` 与 `onInit` 配对使用,确保 Service 的资源生命周期可管理,防止内存泄漏。
|
|
154
|
+
|
|
74
155
|
## 测试
|
|
75
156
|
|
|
76
157
|
```bash
|
package/package.json
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amriogit/injector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "轻量 DI 容器 — Injector, BaseService, InjectionToken。零外部依赖,支持 SSR,Vue 集成。",
|
|
6
|
-
"keywords": [
|
|
6
|
+
"keywords": [
|
|
7
|
+
"di",
|
|
8
|
+
"dependency-injection",
|
|
9
|
+
"injector",
|
|
10
|
+
"typescript",
|
|
11
|
+
"vue",
|
|
12
|
+
"ssr"
|
|
13
|
+
],
|
|
7
14
|
"sideEffects": false,
|
|
8
15
|
"repository": {
|
|
9
16
|
"type": "git",
|
|
@@ -19,7 +26,9 @@
|
|
|
19
26
|
".": "./dist/injector.js",
|
|
20
27
|
"./vue": "./dist/injector-vue.js"
|
|
21
28
|
},
|
|
22
|
-
"files": [
|
|
29
|
+
"files": [
|
|
30
|
+
"dist"
|
|
31
|
+
],
|
|
23
32
|
"publishConfig": {
|
|
24
33
|
"access": "public"
|
|
25
34
|
},
|