Connect with us

Разработка

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

Он не пытается изобрести велосипед, а пытается заставить существующие колеса работать лучше вместе. Короче говоря, Metro стоит на плечах гигантов.

Опубликовано

/

     
     

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)
  }
}

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

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

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

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

  • Проверка графа зависимостей во время компиляции
  • Генерация кода FIR/IR во время компиляции
  • Генерация кода и рантайм в стиле Dagger
  • API в стиле Kotlin-Inject
  • Агрегация в стиле Anvil
  • Мультиплатформенность
  • Интеграция с IDE
  • Расширенный интероп
  • Частные провайдеры и инъекции частных членов
  • Необязательные зависимости
  • Внедрение функции верхнего уровня
  • Подробные, но понятные сообщения об ошибках и диагностика

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

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

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

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

  • ABI – на 47% быстрее
  • ABI без инкрементальной компиляции – на 28% быстрее
  • No-ABI – на 56% быстрее
  • Без ABI и без IC – на 25.5% быстрее

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

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

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

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: