@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.
Files changed (2) hide show
  1. package/README.md +81 -0
  2. 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.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "description": "轻量 DI 容器 — Injector, BaseService, InjectionToken。零外部依赖,支持 SSR,Vue 集成。",
6
- "keywords": ["di", "dependency-injection", "injector", "typescript", "vue", "ssr"],
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": ["dist"],
29
+ "files": [
30
+ "dist"
31
+ ],
23
32
  "publishConfig": {
24
33
  "access": "public"
25
34
  },