import { App } from 'vue'; import { CommonToken } from '@kaokei/di'; import { NewableProvider, FunctionProvider, Provider } from './interface.ts'; /** * 从当前组件或最近的祖先组件的 DI 容器中获取服务实例。 * * 查找顺序: * 1. 先检查当前组件自身是否声明了容器(getCurrentContainer) * 2. 如果没有,则沿组件树向上查找(getProvideContainer) * * @param token - 服务的标识符,可以是类本身(Newable)或 Token 实例 * @returns 对应 token 的服务实例 */ export declare function useService(token: CommonToken): T; /** * 在当前组件中声明服务提供者。 * * 行为逻辑: * - 如果当前组件已经声明过容器(重复调用 declareProviders),则直接在已有容器上追加绑定。 * - 如果当前组件尚未声明容器,则: * 1. 获取父级容器作为 parent * 2. 创建一个子容器(继承父级容器的所有绑定) * 3. 在子容器上绑定新的服务 * 4. 通过 Vue 的 provide 将子容器注入组件树 * 5. 在组件卸载时(onUnmounted)自动销毁子容器,清理资源 * * @param providers - 服务提供者,支持类数组或函数两种形式 */ export declare function declareProviders(providers: FunctionProvider): void; export declare function declareProviders(providers: NewableProvider): void; export declare function declareProviders(providers: Provider): void; /** * 从全局根容器(ROOT_CONTAINER)中获取服务实例。 * 不依赖 Vue 组件树,可以在任何地方调用。 * * @param token - 服务的标识符 * @returns 对应 token 的服务实例 */ export declare function useRootService(token: CommonToken): T; /** * 在全局根容器上声明服务提供者。 * 绑定的服务在整个应用中全局共享。 * * @param providers - 服务提供者,支持类数组或函数两种形式 */ export declare function declareRootProviders(providers: FunctionProvider): void; export declare function declareRootProviders(providers: NewableProvider): void; export declare function declareRootProviders(providers: Provider): void; /** * 在指定 Vue App 实例的上下文中获取服务实例。 * 通过 app.runWithContext 确保 inject 能正确找到该 App 提供的容器。 * 适用于多 App 实例场景。 * * @param token - 服务的标识符 * @param app - 目标 Vue App 实例 * @returns 对应 token 的服务实例 */ export declare function useAppService(token: CommonToken, app: App): T; /** * 在指定 Vue App 实例的上下文中声明服务提供者。 * * 行为逻辑: * - 如果该 App 已经有容器(之前调用过 declareAppProviders),则直接追加绑定。 * - 如果该 App 尚未有容器,则: * 1. 以 ROOT_CONTAINER 为 parent 创建子容器 * 2. 绑定服务 * 3. 通过 app.provide 将容器注入该 App 的组件树 * 4. 在 App 卸载时自动销毁容器 * * @param providers - 服务提供者,支持类数组或函数两种形式 * @param app - 目标 Vue App 实例 */ export declare function declareAppProviders(providers: FunctionProvider, app: App): void; export declare function declareAppProviders(providers: NewableProvider, app: App): void; export declare function declareAppProviders(providers: Provider, app: App): void; /** * declareAppProviders 的 Vue 插件形式。 * 返回一个符合 Vue 插件接口的函数,可直接用于 app.use()。 * * @example * ```ts * const app = createApp(App); * app.use(declareAppProvidersPlugin([ServiceA, ServiceB])); * ``` * * @param providers - 服务提供者 * @returns Vue 插件函数 */ export declare function declareAppProvidersPlugin(providers: Provider): (app: App) => void;