欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 简单服务定位器模式实现

程序员文章站 2022-04-17 13:19:07
依赖注入(dependency injection)和服务定位器(service locator)是实现控制反转(inversion of control)的两种主要手段。android的主流依赖注入...

依赖注入(dependency injection)和服务定位器(service locator)是实现控制反转(inversion of control)的两种主要手段。

android的主流依赖注入框架有:dagger 和 kion

这些依赖注入框架都感觉比较重。

服务定位器比如少见,这里提供一个一个简单的服务定位器模式实现。

引入

项目地址:

repositories { 
  maven { url "https://gitee.com/ezy/repo/raw/android_public/"}
} 
dependencies {
  implementation "me.reezy.jetpack:servicelocator:0.4.0" 
}

api

// 获取实例
inline fun <reified t> resolve(name: string = t::class.java.name): t?
// 注册为单例
inline fun <reified t> singleton(name: string = t::class.java.name, crossinline block: () -> t)
// 注册为工厂
inline fun <reified t> factory(name: string = t::class.java.name, crossinline block: () -> t)

使用

单例,每次resolve获得的都是同一实例

class someservice {
  fun dosomething() {
  }
}

// 注册 
singleton {
  someservice()
}

// 获取
val service = resolve<someservice>() 

具名单例

class namedservice(val name: string) {
  fun dosomething() {
  }
}

// 注册 
singleton("a") {
  namedservice("aaa")
}
singleton("b") {
  namedservice("bbb")
}

// 获取 
val servicea = resolve<namedservice>("a")
val serviceb = resolve<namedservice>("b")

工厂,每次resolve都会产生新实例

class someservice {
  fun dosomething() {
  }
}

// 注册 
factory {
  someservice()
}

// 获取,每次resolve都会产生新实例
val service1 = resolve<someservice>() 
val service2 = resolve<someservice>() 

具名工厂

class namedservice(val name: string) {
  fun dosomething() {
  }
}

// 注册 
factory("a") {
  namedservice("aaa")
}
factory("b") {
  namedservice("bbb")
}

// 获取
// a1 与 a2 是使用同一工厂产生的不同实例
// a1 与 b1 是使用不同工厂产生的不同实例
val servicea1 = resolve<namedservice>("a")
val servicea2 = resolve<namedservice>("a")
val serviceb1 = resolve<namedservice>("b")
val serviceb2 = resolve<namedservice>("b")

以上就是android 简单服务定位器模式实现的详细内容,更多关于android 简单服务定位器模式的资料请关注其它相关文章!