AppInitializer位置分析.md 3.9 KB

AppInitializer 位置分析

🤔 问题

当前位置: base-common/src/main/java/com/narutohuo/xindazhou/common/launch/AppInitializer.kt

问题: AppInitializer 是否应该放在 base-common 中?


📊 架构分析

AppInitializer 的职责

AppInitializer 负责初始化:

  1. base-core(基础设施层)

    • StorageImpl - 统一存储
  2. base-common(业务封装层)

    • ServerConfigManager - 配置管理器
    • AuthManager - 认证管理器
    • NetworkHelper - 网络管理器
    • VersionUpdateManager - 版本更新管理器
    • ApiServiceFactory - API 服务工厂
  3. 能力层(capability-*)

    • SocketIOManager (capability-socketio) - SocketIO 管理器
    • ShareServiceFactory (capability-share) - 分享服务
  4. 第三方库

    • ARouter - 路由框架

🏗️ 架构层次

app(应用层)
  ↓ 依赖所有层
capability-*(能力层)
  ↓ 依赖 base-core
base-common(业务封装层)
  ↓ 依赖 base-core
base-core(基础设施层)

❌ 当前问题

问题1:违反依赖方向

  • base-common 不应该知道能力层的存在
  • AppInitializerbase-common 中,却需要初始化能力层
  • 虽然使用反射避免了编译时依赖,但逻辑上仍然违反了架构原则

问题2:职责不清

  • base-common 是业务封装层,应该封装业务逻辑
  • AppInitializer 是应用初始化逻辑,属于应用层职责
  • 应用层应该负责组装和协调各个模块

问题3:可复用性差

  • 如果其他应用使用 base-common,可能不需要初始化所有模块
  • 放在 base-common 中,强制所有使用者都使用这个初始化逻辑

✅ 正确的位置

推荐:放在 app 模块

理由:

  1. 符合架构原则

    • app 模块依赖所有层,可以协调所有层的初始化
    • app 模块是应用入口,负责组装各个模块
  2. 职责清晰

    • 应用初始化逻辑属于应用层职责
    • base-common 专注于业务封装,不关心应用初始化
  3. 灵活性高

    • 不同应用可以有不同的初始化逻辑
    • 可以根据需要选择性地初始化模块
  4. 依赖关系清晰

    • app 模块可以直接依赖所有层
    • 不需要使用反射(除了可选的能力层)

📝 迁移方案

步骤1:移动到 app 模块

base-common/src/main/java/com/narutohuo/xindazhou/common/launch/AppInitializer.kt
  ↓ 移动到
app/src/main/java/com/narutohuo/xindazhou/launch/AppInitializer.kt

步骤2:更新包名

// 从
package com.narutohuo.xindazhou.common.launch

// 改为
package com.narutohuo.xindazhou.launch

步骤3:更新导入

// XinDaZhouApplication.kt
// 从
import com.narutohuo.xindazhou.common.launch.AppInitializer

// 改为
import com.narutohuo.xindazhou.launch.AppInitializer

步骤4:简化反射代码

  • 对于 base-common 的模块,可以直接导入,不需要反射
  • 对于能力层(capability-*),仍然使用反射(可选依赖)

🎯 最终架构

app(应用层)
  ├─ AppInitializer(应用初始化)
  ├─ XinDaZhouApplication(Application 类)
  └─ 直接依赖:
      ├─ base-common(业务封装层)
      ├─ capability-socketio(能力层,可选)
      └─ capability-share(能力层,可选)

base-common(业务封装层)
  └─ 只依赖 base-core

capability-*(能力层)
  └─ 只依赖 base-core

✅ 结论

AppInitializer 应该放在 app 模块中,而不是 base-common

原因:

  1. 符合架构原则(应用层负责组装)
  2. 职责清晰(应用初始化属于应用层)
  3. 灵活性高(不同应用可以有不同的初始化逻辑)
  4. 依赖关系清晰(不需要反射调用 base-common 的模块)