Skip to content

一款基于`kotlin`语言开发的简单易用的依赖注入框架,拥有较强的扩展性,可以自定义注入器、拦截器。

Notifications You must be signed in to change notification settings

xiazunyang/inject

Repository files navigation

Inject

当前最新版本号:

介绍

  • 一款基于kotlin语言开发的简单易用的依赖注入框架,拥有较强的扩展性,可以自定义注入器、拦截器。除此之外相比其它注入框架并没有什么优势,纯粹是作者的练习之作。

  • 在这个项目你可以看到以下设计模式:

    1. 工厂模式
    2. 责任链模式
    3. 建造者模式
    4. 属性代理
  • inject默认通过构造方法来创建Class的实例,仅满足以下条件时可注入:

    • 为无参构造时
    • 构造方法中所有的参数均可通过inject获取时
  • 提供Retrofit支持,可注入所有通过Retrofit创建的Api实例

  • 提供ROOM支持,可注入所有在RoomDatabase中声明的Dao实例

  • 可自定义Producer.Factory以支持注入更多类型的实例

  • 可自定义Interceptor以拦截所有实例的创建过程

安装方法

  1. 在android工程的根目录下build.gradle文件的适当位置添加以下代码:
buildscript {
    repositories {
        // 添加jitpack仓库
        maven { url 'https://jitpack.io' }
    }
}
  1. 在app模块的build.gradle文件的适当位置添加以下代码:
dependencies {
    // 核心库
    implementation 'cn.numeron:inject:latest_version'
    // ROOM支持库
    implementation 'cn.numeron:inject-room:latest_version'
    // Retrofit支持库
    implementation 'cn.numeron:inject-retrofit:latest_version'
}

使用方法

  • 初始化inject
val inject = Inject.Builder()
    .addComponent {
        // add producer factory
        // 如果使用Retrofit
        addApiProducerFactory(retrofit)
        // 如果使用ROOM
        addDaoProducerFactory(database)
    }
    .addInterceptor { chain ->
        // custom interceptor
    }
    .build()
  • 注入实例
class LoginViewModel : ViewModel() {
    // 注入LoginRepository
    private val loginRepository: LoginRepository by inject
}

class LoginRepository {
    // 注入LoginApi的实例,需要在初始化时调用addApiProducerFactory方法
    private val loginApi: LoginApi by inject
    // 注入UserDao的实例需要在初始化时调用addDaoProducerFactory方法
    private val userDao: UserDao by inject
}

/** Retrofit Api接口 */
interface LoginApi {
    @POST("api/account/login")
    suspend fun login(username: String, password: String)
}

/** ROOM数据库 */
abstract class MyRoomDatabase: RoomDatabase() {
    abstract val userDao: UserDao
}

About

一款基于`kotlin`语言开发的简单易用的依赖注入框架,拥有较强的扩展性,可以自定义注入器、拦截器。

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages