Inject

SwiftPM License: MIT

一个轻量级的依赖注入库,用于 Swift 和 SwiftUI 项目。

安装 Inject

Inject 支持 Swift Package Manager

Swift Package Manager

要使用 Swift Package Manager 安装 Inject,您可以按照 Apple 发布的教程,使用 Inject 仓库的 URL 和当前版本

  1. 在 Xcode 中,选择 “File” → “Add Packages...”
  2. 输入 https://github.com/rmichelberger/Inject

或者您可以将以下依赖项添加到您的 Package.swift

.package(url: "https://github.com/rmichelberger/Inject/", from: "1.0.0")

用法

1. 依赖项

您需要在项目中为每个依赖项定义提供程序。

@Provides 的签名

@Provides var dependency: () -> Dependency = { Dependency() }

每次注入依赖项时,都会调用提供程序函数。

单例

@Singleton 的签名

@Singleton var signleton: Singleton = Singleton()

单例的实例会被存储,并且每次注入时都会提供这个实例。

示例

@Singleton var repository: Repository = RepositoryImpl()

定义项目依赖项的示例

func Dependencies() {

    @Provides var apiService = { ApiService() }
    @Provides var retroSwift = {
        let logger = SimpleLogger()
        let client = OkHttpClient(logger: logger)
        return RetroSwift(client: client)
    }
    @Provides var useCase = { UseCase() }
        

    // ViewModels
    @Provides var artListViewModel = { ArtListViewModel() }
    @Provides var artDetailViewModel = { ArtDetailViewModel() }
    
    // Singletons
    @Singleton var repository: Repository = RepositoryImpl()
}

不要忘记在应用程序启动时初始化依赖项

@main
struct MyApp: App {
    
    init() {
        Dependencies()
    }

2. Inject

要注入依赖项,请使用 @Inject

@Inject private var dependency: Dependency

示例

final class RepositoryImpl: Repository {

    @Inject private var apiService: ApiService

    func getArtList() async throws -> [ArtData] {
        try await apiService.getArtList().data
    }
    
    func getArtDetail(id: Int) async throws -> ArtDetailData {
        try await apiService.getArtDetail(id: id).data
    }
}

单例

对于单例依赖项,请使用 @Singleton

@Singleton private var repository: Repository

视图模型

视图模型可以通过 ViewModel() 注入

@StateObject private var viewModel: ArtListViewModel = ViewModel()

概览

定义 Inject 作用域
@Provide @Inject 生命周期在提供程序函数中定义
@Singleton @Singleton 应用程序生命周期

TODO

贡献

我们始终欢迎来自社区的贡献。请确保您的更改包含单元测试。

灵感来源于 hilt