mcpField
K
koin-patterns

koin-patterns

github.com/ahmed3elshaer开发6642 次安装19 周前更新
代码仓库

关于 koin-patterns

koin-patterns 是一项介绍 Kotlin 中 Koin 依赖注入的技能,面向 Android 开发者。内容涵盖模块配置、生命周期作用域、ViewModel 注入、限定符和测试。

主要功能

  1. 01配置 Koin 模块
  2. 02定义单例与工厂依赖
  3. 03使用作用域与限定符
  4. 04在 Compose 中注入 ViewModel
  5. 05使用 Koin 进行测试

适用场景

  1. 01组织应用依赖
  2. 02提供生命周期作用域对象
  3. 03向 Compose 页面注入 ViewModel
  4. 04使用 Koin 模块测试代码

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ahmed3elshaer/everything-claude-code-mobile --skill koin-patterns

安装后在 Claude Code 中输入/koin-patterns确认已加载。

详细介绍

Koin 依赖注入

使用 Koin 为 Kotlin 提供实用的依赖注入。

模块设置

// AppModule.kt
val appModule = module {
    // Singletons
    single<AppDatabase> { Room.databaseBuilder(...).build() }
    single { get<AppDatabase>().userDao() }
    
    // Factories (new instance each time)
    factory { DateFormatter() }
}

// NetworkModule.kt
val networkModule = module {
    single<HttpClient> {
        HttpClient(OkHttp) {
            install(ContentNegotiation) {
                json(Json { ignoreUnknownKeys = true })
            }
        }
    }
    
    single<AuthApi> { AuthApiImpl(get()) }
    single<UserApi> { UserApiImpl(get()) }
}

// FeatureModule.kt
val homeModule = module {
    // Repository
    single<HomeRepository> { HomeRepositoryImpl(get(), get()) }
    
    // Use Cases
    factory { GetItemsUseCase(get()) }
    factory { GetItemUseCase(get()) }
    
    // ViewModel
    viewModel { HomeViewModel(get()) }
}

应用设置

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        
        startKoin {
            androidContext(this@MyApp)
            modules(
                appModule,
                networkModule,
                homeModule,
                detailModule
            )
        }
    }
}

ViewModel 注入

// In Compose
@Composable
fun HomeScreen(viewModel: HomeViewModel = koinViewModel()) {
    val state by viewModel.state.collectAsStateWithLifecycle()
    // ...
}

// With parameters
@Composable
fun DetailScreen(itemId: String) {
    val viewModel: DetailViewModel = koinViewModel { parametersOf(itemId) }
    // ...
}

// ViewModel definition with params
viewModel { params ->
    DetailViewModel(
        itemId = params.get(),
        repository = get()
    )
}

作用域

// Activity scope
val activityModule = module {
    scope<MainActivity> {
        scoped { NavigationController() }
    }
}

// Usage
class MainActivity : AppCompatActivity(), KoinScopeComponent {
    override val scope: Scope by activityScope()
    
    val nav: NavigationController by inject()
}

限定符

val networkModule = module {
    single(named("auth")) { createAuthClient() }
    single(named("default")) { createDefaultClient() }
}

// Usage
class UserApi(
    @Named("auth") private val client: HttpClient
)

测试

class HomeViewModelTest : KoinTest {
    
    @get:Rule
    val koinRule = KoinTestRule.create {
        modules(testModule)
    }
    
    private val testModule = module {
        single<HomeRepository> { mockk() }
        viewModel { HomeViewModel(get()) }
    }
    
    private val viewModel: HomeViewModel by inject()
    private val repository: HomeRepository by inject()
    
    @Test
    fun `loads items`() = runTest {
        coEvery { repository.getItems() } returns Result.success(listOf())
        // ...
    }
}

请记住:Koin 注重实用性。保持模块组织有序,并使用作用域管理生命周期。

评论

支持 Markdown