Site icon AppTractor

Metro — новый фреймворк внедрения зависимостей для Android

Metro — это фреймворк для внедрения зависимостей во время компиляции, во многом вдохновленный Dagger, Anvil и Kotlin-Inject. Он стремится объединить их лучшие функции в одно целостное решение, добавив несколько новых и реализуя их в виде плагина компилятора.

В течение некоторого времени возникало ощущение, что сообщество Kotlin хотело создать библиотеку, объединяющую эти различные инструменты и функции. Для некоторых из этих задач существуют различные инструменты, но пока не существует единого решения, которое связывало бы их все вместе, устраняло бы некоторые из их ограничений и включало бы новые функции, предлагаемые плагинами компиляторов. Metro пытается стать таким ответом. Он не пытается изобрести велосипед, а пытается заставить существующие колеса работать лучше вместе. Короче говоря, Metro стоит на плечах гигантов.

Установка

Metro 0.1.1 доступен сегодня. Установка проста!

plugins {
  id("dev.zacsweers.metro") version "0.1.1"
}

Документация: https://zacsweers.github.io/metro/
Runtime API: https://zacsweers.github.io/metro/api/0.x/
Репозиторий: https://github.com/zacsweers/metro

Фичи

Если вы когда-либо работали с Dagger или kotlin-inject, то в Metro вы почувствуете себя как дома.

Графы — это интерфейсы или абстрактные классы, аннотированные @DependencyGraph.

@DependencyGraph
interface AppGraph {
  val httpClient: HttpClient
}

val graph = createGraph<AppGraph>()

Предоставляйте зависимости с помощью внедрения конструктора в стиле JSR-330 или провайдеров непосредственно в ваших графах.

@DependencyGraph
interface AppGraph {
  val httpClient: HttpClient

  @Provides
  private fun provideFileSystem(): FileSystem = FileSystem.SYSTEM
}

@Inject
class HttpClient(private val fileSystem: FileSystem)

Выполните вспомогательную инъекцию с помощью @Assisted и @AssistedFactory.

@DependencyGraph
interface AppGraph {
  val cacheFactory: Cache.Factory

  @Provides
  private fun provideFileSystem(): FileSystem = FileSystem.SYSTEM
}

@Inject
class Cache(@Assisted size: Long, fs: FileSystem) {
  @AssistedFactory
  interface Factory {
    fun create(size: Long): Cache
  }
}

Добавляйте и объединяйте биндинги как в Anvil.

@ContributesBinding(AppScope::class)
@Inject
class CacheImpl(...) : Cache

Необязательные зависимости. Если зависимость не существует в внедряемом графе, используется значение параметра по умолчанию.

@Inject
class Cache(fs: FileSystem = FileSystem.SYSTEM)

Внедрение функций верхнего уровня.

@Inject
@Composable
fun App(circuit: Circuit) {
  ProvideCircuitCompositionLocals(circuit) {
    CircuitContent(HomeScreen)
  }
}

Подробные, но понятные сообщения об ошибках и диагностика.

И многое другое!

Основные моменты

Перейдите в раздел «Возможности» на сайте проекта, чтобы получить полный обзор, а в разделе «Использование» получите полную документацию по всем доступным API.

Производительность сборки

Будучи плагином компилятора, Metro работает значительно быстрее. При сравнительном тестировании моего приложения CatchUp производительность сборки значительно возросла.

Средние улучшения

Будущая работа

Metro все еще находится в стадии активной разработки. Это всего лишь первый релиз, в нем будут ошибки, и есть несколько важных функций, которые я хочу реализовать в дальнейшем. Биндинги, допускающие значение NULL, @ContributesGraphExtension и сообщения о неиспользуемых биндингах — вот лишь некоторые из них. Более подробную информацию можно найти в системе отслеживания ошибок и обсуждениях в репозитории.

Exit mobile version