create-dp-koa 1.0.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 (235) hide show
  1. package/README.md +50 -0
  2. package/index.mjs +97 -0
  3. package/package.json +33 -0
  4. package/template/.env.development +9 -0
  5. package/template/.env.production +12 -0
  6. package/template/.github/workflows/ci-cd.yml +182 -0
  7. package/template/.trae/documents/controller_development_plan.md +386 -0
  8. package/template/.trae/skills/00-backend-core.skill.md +50 -0
  9. package/template/.trae/skills/01-backend-skill-router.skill.md +55 -0
  10. package/template/.trae/skills/10-backend-api.skill.md +54 -0
  11. package/template/.trae/skills/11-backend-controller-recipes.skill.md +107 -0
  12. package/template/.trae/skills/20-backend-repository.skill.md +25 -0
  13. package/template/.trae/skills/21-backend-service.skill.md +135 -0
  14. package/template/.trae/skills/25-backend-comments-and-doc.skill.md +97 -0
  15. package/template/.trae/skills/30-backend-validation.skill.md +320 -0
  16. package/template/.trae/skills/40-backend-error-logging.skill.md +21 -0
  17. package/template/.trae/skills/50-backend-bootstrap-lifecycle.skill.md +90 -0
  18. package/template/.trae/skills/60-backend-router-registration.skill.md +71 -0
  19. package/template/.trae/skills/70-backend-middleware.skill.md +98 -0
  20. package/template/.trae/skills/80-backend-utils-and-libs.skill.md +90 -0
  21. package/template/.trae/skills/85-backend-plugins.rule.md +64 -0
  22. package/template/.trae/skills/90-backend-testing.skill.md +29 -0
  23. package/template/.trae/skills/README.md +49 -0
  24. package/template/.vscode/launch.json +38 -0
  25. package/template/.vscode/settings.json +1 -0
  26. package/template/Dockerfile +36 -0
  27. package/template/README.md +229 -0
  28. package/template/docker-compose.yml +135 -0
  29. package/template/docs/API_DOCUMENTATION.md +837 -0
  30. package/template/docs/ARCHITECTURE_REFACTOR.md +109 -0
  31. package/template/docs/CACHE_MIGRATION_GUIDE.md +142 -0
  32. package/template/docs/DEPLOYMENT_GUIDE.md +1062 -0
  33. package/template/docs/DEVELOPMENT_GUIDE.md +1097 -0
  34. package/template/docs/DOCUMENTATION_CLEANUP_REPORT.md +166 -0
  35. package/template/docs/DOCUMENTATION_COMPLETION_REPORT.md +223 -0
  36. package/template/docs/DOCUMENTATION_INDEX.md +294 -0
  37. package/template/docs/DOCUMENTATION_STRUCTURE.md +221 -0
  38. package/template/docs/ENTERPRISE_ANNOTATION_SYSTEM_GUIDE.md +2069 -0
  39. package/template/docs/ENTERPRISE_DATABASE_ARCHITECTURE.md +318 -0
  40. package/template/docs/ENTERPRISE_DEPLOYMENT_GUIDE.md +547 -0
  41. package/template/docs/ENTERPRISE_ERROR_HANDLING_GUIDE.md +357 -0
  42. package/template/docs/ENTERPRISE_LOGGING_SYSTEM_GUIDE.md +494 -0
  43. package/template/docs/ENVIRONMENT_CONFIG_EXAMPLE.md +69 -0
  44. package/template/docs/FINAL_IMPLEMENTATION_SUMMARY.md +206 -0
  45. package/template/docs/HEALTH_CHECK_ROUTE_FIX.md +134 -0
  46. package/template/docs/IMPLEMENTATION_CHECKLIST.md +204 -0
  47. package/template/docs/INSTALLATION_GUIDE.md +611 -0
  48. package/template/docs/INTERCEPTOR_TESTING_REPORT.md +226 -0
  49. package/template/docs/INTERCEPTOR_TESTING_SCRIPTS.md +143 -0
  50. package/template/docs/LOGGING_OPTIMIZATION_GUIDE.md +126 -0
  51. package/template/docs/MEMORY_DATABASE_GUIDE.md +212 -0
  52. package/template/docs/NEW_ROUTER_INTEGRATION_GUIDE.md +345 -0
  53. package/template/docs/NEW_ROUTER_INTEGRATION_SUMMARY.md +259 -0
  54. package/template/docs/NEW_ROUTER_USAGE_GUIDE.md +364 -0
  55. package/template/docs/QUICK_START.md +268 -0
  56. package/template/docs/ROUTE_SLASH_COMPATIBILITY_FIX.md +191 -0
  57. package/template/docs/SERVICE_INTERCEPTOR_GUIDE.md +243 -0
  58. package/template/docs/SERVICE_LAYER_INDEX.md +205 -0
  59. package/template/docs/SERVICE_PATTERN_GUIDE.md +270 -0
  60. package/template/docs/SERVICE_RETURN_VALUE_SPECIFICATION.md +466 -0
  61. package/template/docs/SWAGGER_DEBUG_MODE_GUIDE.md +80 -0
  62. package/template/docs/SWAGGER_INTEGRATION_GUIDE.md +416 -0
  63. package/template/docs/TRANSACTION_MANAGER_USAGE.md +360 -0
  64. package/template/docs/TROUBLESHOOTING.md +869 -0
  65. package/template/env.production.example +62 -0
  66. package/template/jest.config.js +34 -0
  67. package/template/package-lock.json +13240 -0
  68. package/template/package.json +119 -0
  69. package/template/patches/typeorm+0.3.25.patch +22 -0
  70. package/template/scripts/sync-template.mjs +84 -0
  71. package/template/scripts/test-annotation-system.sh +48 -0
  72. package/template/scripts/test-core-functionality.sh +28 -0
  73. package/template/src/annotations/decorators/ConfigManagement.ts +9 -0
  74. package/template/src/annotations/decorators/DistributedTracing.ts +9 -0
  75. package/template/src/annotations/decorators/EnterprisePerformance.ts +9 -0
  76. package/template/src/annotations/decorators/PerformanceMonitor.ts +32 -0
  77. package/template/src/annotations/decorators/SecurityAudit.ts +9 -0
  78. package/template/src/annotations/index.ts +50 -0
  79. package/template/src/annotations/processors/ConfigManagementProcessor.ts +369 -0
  80. package/template/src/annotations/processors/DistributedTracingProcessor.ts +288 -0
  81. package/template/src/annotations/processors/EnterprisePerformanceProcessor.ts +189 -0
  82. package/template/src/annotations/processors/PerformanceMonitorProcessor.ts +101 -0
  83. package/template/src/annotations/processors/SecurityAuditProcessor.ts +345 -0
  84. package/template/src/annotations/processors/SwaggerProcessor.ts +612 -0
  85. package/template/src/annotations/processors/index.ts +10 -0
  86. package/template/src/app.ts +123 -0
  87. package/template/src/controllers/base.controller.ts +41 -0
  88. package/template/src/controllers/cacheManagement.controller.ts +131 -0
  89. package/template/src/controllers/captcha.controller.ts +57 -0
  90. package/template/src/controllers/demo/AnnotationDemoController.ts +118 -0
  91. package/template/src/controllers/example/EnterpriseExampleController.ts +297 -0
  92. package/template/src/controllers/example/ExampleController.ts +110 -0
  93. package/template/src/controllers/example/NewAnnotationExampleController.ts +159 -0
  94. package/template/src/controllers/example/SwaggerExampleController.ts +205 -0
  95. package/template/src/controllers/example/TransactionExample.controller.ts +336 -0
  96. package/template/src/controllers/health.controller.ts +235 -0
  97. package/template/src/controllers/home/register.controller.ts +58 -0
  98. package/template/src/controllers/home/ytGoods.controller.ts +92 -0
  99. package/template/src/controllers/home/ytShop.controller.ts +135 -0
  100. package/template/src/controllers/home/ytUser.controller.ts +89 -0
  101. package/template/src/controllers/logManagement.controller.ts +396 -0
  102. package/template/src/controllers/public/emailSend.controller.ts +65 -0
  103. package/template/src/controllers/public/ytUserAuth.controller.ts +174 -0
  104. package/template/src/controllers/testData.controller.ts +253 -0
  105. package/template/src/dto/controller/example/NewAnnotationExampleController.dto.ts +73 -0
  106. package/template/src/dto/controller/home/emailSend.controller.dto.ts +40 -0
  107. package/template/src/dto/controller/home/register.controller.dto.ts +45 -0
  108. package/template/src/dto/controller/home/ytGoods.controller.dto.ts +55 -0
  109. package/template/src/dto/controller/home/ytShop.controller.dto.ts +69 -0
  110. package/template/src/dto/controller/home/ytUser.controller.dto.ts +44 -0
  111. package/template/src/dto/controller/public/ytUserAuth.controller.dto.ts +63 -0
  112. package/template/src/dto/goods.dto.ts +212 -0
  113. package/template/src/dto/service/ytService.dto.ts +13 -0
  114. package/template/src/dto/user.dto.ts +177 -0
  115. package/template/src/entity/base.entity.ts +13 -0
  116. package/template/src/entity/columnTypes.ts +13 -0
  117. package/template/src/entity/goodsImagesUnlockKey.entity.ts +33 -0
  118. package/template/src/entity/goodsUnlocker.entity.ts +34 -0
  119. package/template/src/entity/index.ts +15 -0
  120. package/template/src/entity/shop.entity.ts +52 -0
  121. package/template/src/entity/shopUser.entity.ts +41 -0
  122. package/template/src/entity/ytGoods.entity.ts +94 -0
  123. package/template/src/entity/ytUser.entity.ts +96 -0
  124. package/template/src/examples/InterceptorExampleRunner.ts +284 -0
  125. package/template/src/examples/ServiceInterceptorExample.ts +214 -0
  126. package/template/src/examples/SwaggerProcessorExample.ts +169 -0
  127. package/template/src/examples/TransactionManagerDemo.ts +377 -0
  128. package/template/src/examples/cacheExamples.ts +155 -0
  129. package/template/src/framework/decorator/controller.ts +311 -0
  130. package/template/src/framework/decorator/processor/AnnotationDecorators.ts +100 -0
  131. package/template/src/framework/decorator/processor/AnnotationProcessor.ts +156 -0
  132. package/template/src/framework/decorator/processor/AnnotationProcessorConfig.ts +45 -0
  133. package/template/src/framework/decorator/processor/AnnotationRegistry.ts +117 -0
  134. package/template/src/framework/decorator/processor/AnnotationSystemInitializer.ts +95 -0
  135. package/template/src/framework/decorator/processor/ProcessorManager.ts +76 -0
  136. package/template/src/framework/decorator/processor/processors/CustomProcessors.ts +126 -0
  137. package/template/src/framework/decorator/processor/processors/DefaultProcessors.ts +207 -0
  138. package/template/src/framework/decorator/refactored/DecoratorFactory.ts +99 -0
  139. package/template/src/framework/decorator/refactored/DecoratorMetadataManager.ts +125 -0
  140. package/template/src/framework/decorator/refactored/DecoratorValidator.ts +128 -0
  141. package/template/src/framework/decorator/refactored/TypeSafeDecorators.ts +139 -0
  142. package/template/src/framework/decorator/refactored/index.ts +98 -0
  143. package/template/src/framework/decorator/swagger.ts +150 -0
  144. package/template/src/framework/interceptors/AdvancedServiceCallInterceptor.ts +375 -0
  145. package/template/src/framework/interceptors/ServiceCallInterceptor.ts +348 -0
  146. package/template/src/framework/interceptors/index.ts +19 -0
  147. package/template/src/framework/plugins/registry.ts +63 -0
  148. package/template/src/framework/plugins/types.ts +15 -0
  149. package/template/src/framework/types/ServiceResult.ts +151 -0
  150. package/template/src/framework/types/index.ts +16 -0
  151. package/template/src/framework/utils/CacheManager.ts +430 -0
  152. package/template/src/framework/utils/CacheService.ts +248 -0
  153. package/template/src/framework/utils/DtoValidator.ts +164 -0
  154. package/template/src/framework/utils/MigrationHelper.ts +179 -0
  155. package/template/src/framework/utils/MigrationManager.ts +256 -0
  156. package/template/src/framework/utils/NewRouter.ts +207 -0
  157. package/template/src/framework/utils/TransactionManager.ts +172 -0
  158. package/template/src/framework/utils/bootstrap.ts +445 -0
  159. package/template/src/framework/utils/cache.ts +269 -0
  160. package/template/src/framework/utils/databaseConfig.ts +148 -0
  161. package/template/src/framework/utils/db.ts +39 -0
  162. package/template/src/framework/utils/dbMonitor.ts +106 -0
  163. package/template/src/framework/utils/dynamicSwagger.ts +410 -0
  164. package/template/src/framework/utils/function.ts +61 -0
  165. package/template/src/framework/utils/gracefulShutdown.ts +131 -0
  166. package/template/src/framework/utils/logger.ts +388 -0
  167. package/template/src/framework/utils/metrics.ts +182 -0
  168. package/template/src/framework/utils/router.ts +417 -0
  169. package/template/src/framework/utils/swagger.ts +184 -0
  170. package/template/src/framework/utils/testDb.ts +19 -0
  171. package/template/src/framework/utils/token.ts +23 -0
  172. package/template/src/framework/utils/transform.ts +17 -0
  173. package/template/src/libs/aokEmailSender.ts +42 -0
  174. package/template/src/libs/captcha.ts +37 -0
  175. package/template/src/libs/cos.ts +45 -0
  176. package/template/src/libs/mCache.ts +7 -0
  177. package/template/src/libs/serviceValidate.ts +3 -0
  178. package/template/src/libs/tecentSms.ts +51 -0
  179. package/template/src/middlewares/a.middleware.ts +6 -0
  180. package/template/src/middlewares/error.middleware.ts +14 -0
  181. package/template/src/middlewares/logging.middleware.ts +187 -0
  182. package/template/src/middlewares/static.middleware.ts +79 -0
  183. package/template/src/middlewares/swagger.middleware.ts +70 -0
  184. package/template/src/middlewares/token.middleware.ts +32 -0
  185. package/template/src/migrations/1700000000000-InitialDatabaseStructure.ts +172 -0
  186. package/template/src/migrations/index.ts +6 -0
  187. package/template/src/plugins/weboffice/core/context.ts +47 -0
  188. package/template/src/plugins/weboffice/core/errors.ts +51 -0
  189. package/template/src/plugins/weboffice/core/types.ts +63 -0
  190. package/template/src/plugins/weboffice/core/utils.ts +7 -0
  191. package/template/src/plugins/weboffice/entities/index.ts +3 -0
  192. package/template/src/plugins/weboffice/entities/webofficeFile.entity.ts +28 -0
  193. package/template/src/plugins/weboffice/entities/webofficeFileVersion.entity.ts +29 -0
  194. package/template/src/plugins/weboffice/http/routes.ts +179 -0
  195. package/template/src/plugins/weboffice/index.ts +23 -0
  196. package/template/src/plugins/weboffice/services/webofficeCallback.service.ts +274 -0
  197. package/template/src/repository/UserRepository.ts +122 -0
  198. package/template/src/repository/base/BaseRepository.ts +124 -0
  199. package/template/src/repository/interfaces/IBaseRepository.ts +67 -0
  200. package/template/src/routers/index.ts +49 -0
  201. package/template/src/service/base.service.ts +116 -0
  202. package/template/src/service/paramValidateTest.service.ts +139 -0
  203. package/template/src/service/ytGoods.service.ts +42 -0
  204. package/template/src/service/ytShop.service.ts +90 -0
  205. package/template/src/service/ytUser.service.ts +451 -0
  206. package/template/src/test/swaggerParameterTest.ts +90 -0
  207. package/template/src/utils/testDataInitializer.ts +296 -0
  208. package/template/static/output.json +15203 -0
  209. package/template/test/controllers/controllers.test.ts +173 -0
  210. package/template/test/controllers/example/ExampleController.test.ts +222 -0
  211. package/template/test/controllers/example/NewAnnotationExampleController.test.ts +200 -0
  212. package/template/test/framework/TransactionManagerDemo.test.ts +363 -0
  213. package/template/test/framework/annotation/AnnotationDecorators.test.ts +222 -0
  214. package/template/test/framework/annotation/AnnotationExecutor.test.ts +246 -0
  215. package/template/test/framework/annotation/AnnotationProcessor.test.ts +179 -0
  216. package/template/test/framework/annotation/CustomProcessors.test.ts +313 -0
  217. package/template/test/framework/annotation/DefaultProcessors.test.ts +371 -0
  218. package/template/test/framework/annotation/NewRouter.test.ts +272 -0
  219. package/template/test/framework/annotation/ProcessorManager.test.ts +248 -0
  220. package/template/test/framework/annotation/setup.ts +26 -0
  221. package/template/test/framework/cache.test.ts +101 -0
  222. package/template/test/framework/databaseConfig.test.ts +142 -0
  223. package/template/test/integration/integration.test.ts +153 -0
  224. package/template/test/plugins/weboffice/http.routes.int.test.ts +61 -0
  225. package/template/test/service/business.test.ts +87 -0
  226. package/template/test/service/paramValidateTest.service.test.ts +184 -0
  227. package/template/test/service/ytUser.service.test.ts +566 -0
  228. package/template/test/setup.ts +20 -0
  229. package/template/test/setupAfterEnv.ts +14 -0
  230. package/template/test/utils/testHelpers.ts +220 -0
  231. package/template/test_output.txt +0 -0
  232. package/template/tsconfig.build.json +17 -0
  233. package/template/tsconfig.json +31 -0
  234. package/template/webpack.config.js +71 -0
  235. package/template/yarn.lock +7354 -0
@@ -0,0 +1,270 @@
1
+ # Service 层开发指南
2
+
3
+ ## 问题
4
+
5
+ 在之前的实现中,每个 Service 如果需要延迟初始化 Repository,都要写很多冗余代码:
6
+
7
+ ```typescript
8
+ private userRepository: IUserRepository;
9
+
10
+ constructor() {
11
+ this.userRepository = null as any;
12
+ }
13
+
14
+ private ensureRepositoryInitialized(): void {
15
+ if (!this.userRepository) {
16
+ this.initializeRepository();
17
+ }
18
+ if (!this.userRepository) {
19
+ throw new Error("数据库未初始化,请等待数据库初始化完成");
20
+ }
21
+ }
22
+
23
+ private initializeRepository(): void {
24
+ const dataSource = getDataSource();
25
+ if (!dataSource) {
26
+ logger.warn("数据库未初始化,将在数据库初始化后重试");
27
+ return;
28
+ }
29
+
30
+ const repository = dataSource.getRepository(YtUserEntity);
31
+ this.userRepository = new UserRepository(repository);
32
+
33
+ transactionManager.setDataSource(dataSource);
34
+ }
35
+
36
+ // 每个方法都要调用
37
+ async createUser(...) {
38
+ this.ensureRepositoryInitialized(); // 每次都调用
39
+ // ...
40
+ }
41
+ ```
42
+
43
+ 这样写确实很冗余,而且每个方法都要调用 `ensureRepositoryInitialized()`。
44
+
45
+ ## 解决方案
46
+
47
+ ### 方案1:使用懒加载 Getter(推荐)
48
+
49
+ 继承 `BaseService`,使用 `createLazyRepository` 方法:
50
+
51
+ ```typescript
52
+ export class YtUserService extends BaseService {
53
+ private repositoryCache = new Map<string, any>();
54
+
55
+ /**
56
+ * 获取用户Repository(懒加载)
57
+ * 使用基类的通用方法
58
+ */
59
+ private get userRepository(): IUserRepository {
60
+ return this.createLazyRepository(
61
+ YtUserEntity,
62
+ UserRepository,
63
+ this.repositoryCache
64
+ );
65
+ }
66
+
67
+ // 使用时直接访问,无需额外初始化
68
+ async createUser(...) {
69
+ const user = await this.userRepository.save(...); // 自动初始化
70
+ }
71
+ }
72
+ ```
73
+
74
+ **优点**:
75
+ - 代码非常简洁,只需几行代码
76
+ - 通用方法可复用,所有 Service 都能用
77
+ - 懒加载,只在真正使用时才初始化
78
+ - 自动处理数据库未初始化的情况
79
+
80
+ **优点**:
81
+ - 代码简洁,无需在每个方法中调用初始化
82
+ - 懒加载,只在真正使用时才初始化
83
+ - 自动处理数据库未初始化的情况
84
+
85
+ ### 方案2:继承 BaseService(适用于简单 CRUD)
86
+
87
+ 对于简单的 CRUD 操作,直接继承 `BaseService`:
88
+
89
+ ```typescript
90
+ import { BaseService } from "@src/service/base.service";
91
+
92
+ export class YtGoodsService extends BaseService {
93
+
94
+ async unlockGoodsImage(goodsId: number, userId: number, key: string) {
95
+ // 直接使用 getDataRepository
96
+ const keyRepo = this.getDataRepository(GoodsImagesUnlockKeyEntity);
97
+ const unlockKey = await keyRepo.findOneBy({ key });
98
+
99
+ // ...
100
+ }
101
+ }
102
+ ```
103
+
104
+ **优点**:
105
+ - 最简洁,无需初始化代码
106
+ - 适合简单的数据库操作
107
+ - `BaseService` 已经处理了数据库初始化检查
108
+
109
+ ## 使用场景
110
+
111
+ ### 场景1:需要 Repository 模式(自定义逻辑)
112
+
113
+ 适合:
114
+ - 需要复杂的业务逻辑
115
+ - 需要封装 Repository 方法
116
+ - 需要事务管理
117
+
118
+ ```typescript
119
+ @Injectable()
120
+ export class YtUserService {
121
+ private _userRepository: IUserRepository | null = null;
122
+
123
+ private get userRepository(): IUserRepository {
124
+ if (!this._userRepository) {
125
+ const dataSource = getDataSource();
126
+ if (!dataSource || !dataSource.isInitialized) {
127
+ throw new Error("数据库未初始化");
128
+ }
129
+ this._userRepository = new UserRepository(
130
+ dataSource.getRepository(YtUserEntity)
131
+ );
132
+ }
133
+ return this._userRepository;
134
+ }
135
+
136
+ async createUser(dto: CreateUserDto) {
137
+ // 直接使用,自动初始化
138
+ return await this.userRepository.save(user);
139
+ }
140
+ }
141
+ ```
142
+
143
+ ### 场景2:简单的 CRUD 操作
144
+
145
+ 适合:
146
+ - 直接使用 TypeORM Repository
147
+ - 简单的数据库操作
148
+ - 无需自定义 Repository 逻辑
149
+
150
+ ```typescript
151
+ export class YtShopService extends BaseService {
152
+
153
+ async getGoodsListByShopId(shopId: number) {
154
+ const ds = this.getDataRepository(YtGoodsEntity);
155
+ return await ds.find({ where: { shopId } });
156
+ }
157
+ }
158
+ ```
159
+
160
+ ## 最佳实践
161
+
162
+ 1. **优先使用 BaseService**
163
+ - 大多数场景下,继承 `BaseService` 就足够了
164
+ - 代码更简洁,维护成本更低
165
+
166
+ 2. **只在需要时使用懒加载 Getter**
167
+ - 当你需要封装 Repository 方法时
168
+ - 当你需要更复杂的业务逻辑时
169
+
170
+ 3. **避免重复初始化代码**
171
+ - 不要在构造器中初始化 Repository
172
+ - 不要在每个方法中手动初始化
173
+ - 使用 getter 或继承 BaseService
174
+
175
+ ## 完整示例
176
+
177
+ ### 使用懒加载 Getter 的 Service
178
+
179
+ ```typescript
180
+ @Injectable()
181
+ export class YtUserService extends BaseService {
182
+ private repositoryCache = new Map<string, any>();
183
+
184
+ /**
185
+ * 获取用户Repository(懒加载)
186
+ * 使用基类的通用方法
187
+ */
188
+ private get userRepository(): IUserRepository {
189
+ return this.createLazyRepository(
190
+ YtUserEntity,
191
+ UserRepository,
192
+ this.repositoryCache
193
+ );
194
+ }
195
+
196
+ async createUser(dto: CreateUserDto): Promise<CommonServiceResult<YtUserEntity>> {
197
+ try {
198
+ // Repository 自动初始化,无需手动调用
199
+ const user = await this.userRepository.save(...);
200
+ return CommonServiceResult.success(user);
201
+ } catch (error) {
202
+ return CommonServiceResult.error("创建失败");
203
+ }
204
+ }
205
+ }
206
+ ```
207
+
208
+ ### 需要多个 Repository 的 Service
209
+
210
+ ```typescript
211
+ @Injectable()
212
+ export class ComplexService extends BaseService {
213
+ private repositoryCache = new Map<string, any>();
214
+
215
+ private get userRepository(): IUserRepository {
216
+ return this.createLazyRepository(YtUserEntity, UserRepository, this.repositoryCache);
217
+ }
218
+
219
+ private get goodsRepository(): IGoodsRepository {
220
+ return this.createLazyRepository(YtGoodsEntity, GoodsRepository, this.repositoryCache);
221
+ }
222
+
223
+ async complexOperation() {
224
+ // 自动初始化两个 Repository
225
+ const user = await this.userRepository.findById(1);
226
+ const goods = await this.goodsRepository.findById(1);
227
+ }
228
+ }
229
+ ```
230
+
231
+ ### 使用 BaseService 的 Service
232
+
233
+ ```typescript
234
+ export class YtShopService extends BaseService {
235
+
236
+ async getGoodsListByShopId(shopId: number, page: number, pageSize: number) {
237
+ try {
238
+ const ds = this.getDataRepository(YtGoodsEntity);
239
+ const result = await ds.findAndCount({
240
+ where: { shopId },
241
+ skip: (page - 1) * pageSize,
242
+ take: pageSize
243
+ });
244
+ return CommonServiceResult.success(result);
245
+ } catch (error) {
246
+ return CommonServiceResult.error("查询失败");
247
+ }
248
+ }
249
+ }
250
+ ```
251
+
252
+ ## 总结
253
+
254
+ - ✅ **推荐**:简单 CRUD 使用 `BaseService`
255
+ - ✅ **推荐**:复杂逻辑使用懒加载 Getter
256
+ - ❌ **避免**:每个方法都调用 `ensureRepositoryInitialized()`
257
+ - ❌ **避免**:在构造器中初始化 Repository
258
+
259
+ 这样可以让代码更简洁、更易维护。
260
+
261
+ ---
262
+
263
+ ## 相关文档
264
+
265
+ - 📖 [Service 返回值规范](./SERVICE_RETURN_VALUE_SPECIFICATION.md) - Service 层必须返回 `CommonServiceResult<T>` 对象
266
+ - 📖 [TransactionManager 使用指南](./TRANSACTION_MANAGER_USAGE.md) - 事务管理器的使用
267
+ - 📖 [企业级数据库架构](./ENTERPRISE_DATABASE_ARCHITECTURE.md) - 数据库架构设计
268
+
269
+
270
+