feat: implement lazy singleton pattern for repository instances and update related imports

This commit is contained in:
2026-06-29 17:25:41 +08:00
parent 96612da5c0
commit 0bae53bfba
14 changed files with 69 additions and 74 deletions
+9 -17
View File
@@ -1,17 +1,5 @@
"use client";
/**
* AuthRepository
*
* 认证仓库:编排远程 API + 本地 AuthStorage + UserStorage。
* 行为对齐原 Dart `lib/data/repositories/auth_repository_impl.dart`
* - 登录成功后调 `_saveLoginData` 持久化 token + User
* - 登出先调 API,再强制清本地态(无论 API 成败)
* - `getCurrentUser` 成功后尽力写本地 User 缓存(不因缓存失败影响主流程)
* - 写 storage 失败用 `Logger.warn` 记录,不让本地缓存失败影响主流程
*
*
*/
import { AuthApi, authApi } from "@/data/services/api";
import {
AppleLoginRequest,
@@ -32,6 +20,7 @@ import { AppEnvUtil, Result, Logger } from "@/utils";
import type { IAuthRepository } from "@/data/repositories/interfaces";
import { AuthStorage, type IAuthStorage } from "@/data/storage/auth";
import { UserStorage, type IUserStorage } from "@/data/storage/user";
import { createLazySingleton } from "./lazy_singleton";
const log = new Logger("DataRepositoriesAuthRepository");
@@ -312,11 +301,14 @@ export class AuthRepository implements IAuthRepository {
}
}
/** 全局单例。 */
export const authRepository = new AuthRepository(
authApi,
AuthStorage.getInstance(),
UserStorage.getInstance(),
/** 全局单例。 */
export const getAuthRepository = createLazySingleton<IAuthRepository>(
() =>
new AuthRepository(
authApi,
AuthStorage.getInstance(),
UserStorage.getInstance(),
),
);
function withTestAccountFlag<T extends Record<string, unknown>>(
+8 -4
View File
@@ -13,6 +13,7 @@ import {
import { Result } from "@/utils";
import type { IChatRepository } from "@/data/repositories/interfaces";
import { LocalChatStorage, LocalMessage } from "@/data/storage/chat";
import { createLazySingleton } from "./lazy_singleton";
export class ChatRepository implements IChatRepository {
constructor(
@@ -186,8 +187,11 @@ export class ChatRepository implements IChatRepository {
}
}
/** 全局单例。 */
export const chatRepository = new ChatRepository(
chatApi,
LocalChatStorage.getInstance(),
/** 全局单例。 */
export const getChatRepository = createLazySingleton<IChatRepository>(
() =>
new ChatRepository(
chatApi,
LocalChatStorage.getInstance(),
),
);
+7
View File
@@ -0,0 +1,7 @@
export function createLazySingleton<T>(factory: () => T): () => T {
let instance: T | null = null;
return () => {
instance ??= factory();
return instance;
};
}
+5 -2
View File
@@ -9,6 +9,7 @@ import { MetricsApi, metricsApi } from "@/data/services/api";
import { AppEvent, PwaEvent } from "@/data/dto/metrics";
import { Result } from "@/utils";
import type { IMetricsRepository } from "@/data/repositories/interfaces";
import { createLazySingleton } from "./lazy_singleton";
export class MetricsRepository implements IMetricsRepository {
constructor(private readonly api: MetricsApi) {}
@@ -56,5 +57,7 @@ export class MetricsRepository implements IMetricsRepository {
}
}
/** 全局单例。 */
export const metricsRepository = new MetricsRepository(metricsApi);
/** 全局单例。 */
export const getMetricsRepository = createLazySingleton<IMetricsRepository>(
() => new MetricsRepository(metricsApi),
);
+5 -2
View File
@@ -18,6 +18,7 @@ import { PaymentApi, paymentApi } from "@/data/services/api";
import { PaymentPlansStorage } from "@/data/storage/payment";
import type { IPaymentRepository } from "@/data/repositories/interfaces";
import { Result } from "@/utils/result";
import { createLazySingleton } from "./lazy_singleton";
export class PaymentRepository implements IPaymentRepository {
constructor(private readonly api: PaymentApi) {}
@@ -83,8 +84,10 @@ export class PaymentRepository implements IPaymentRepository {
}
}
/** 全局单例。 */
export const paymentRepository = new PaymentRepository(paymentApi);
/** 全局单例。 */
export const getPaymentRepository = createLazySingleton<IPaymentRepository>(
() => new PaymentRepository(paymentApi),
);
export function isVipPaymentPlan(plan: PaymentPlan): boolean {
return plan.vipDays !== null;
+5 -2
View File
@@ -10,6 +10,7 @@ import {
} from "@/data/dto/user";
import { Result } from "@/utils";
import type { IUserRepository } from "@/data/repositories/interfaces";
import { createLazySingleton } from "./lazy_singleton";
export class UserRepository implements IUserRepository {
constructor(private readonly api: UserApi) {}
@@ -48,5 +49,7 @@ export class UserRepository implements IUserRepository {
}
}
/** 全局单例。 */
export const userRepository = new UserRepository(userApi);
/** 全局单例。 */
export const getUserRepository = createLazySingleton<IUserRepository>(
() => new UserRepository(userApi),
);