¿Cómo usar Inyección de dependencia con Kotlin targeting JavaScript?

Actualmente estoy evaluando portar una gran aplicación Java / Swing a Kotlin. El dominio de la aplicación es charts 2D, charts, edición gráfica y simulación / animation. Quiero volver a escribir todo el núcleo de la aplicación en Kotlin y transstackrlo a código de bytes de Java, así como a JavaScript. Actualmente puedo escribir el código de dibujo de Kotlin que se representa tanto en una window de Java como en un canvas HTML, utilizando algunas classs de adaptadores y puentes. Hasta aquí todo bien.

Ahora estoy luchando con la dependency injection, que estoy usando intensamente en mi aplicación. Quiero inyectar dependencies en mis classs de Kotlin y aún así poder transstackrlas a la JVM y a JavaScript, así que busqué frameworks DI para Kotlin. Encontré injekt y kodein , pero parece que ambos dependen de las classs de JDK, por lo que no son aplicables para mi caso de uso de JavaScript. Por lo tanto, comencé a desarrollar mi propio framework Kotlin DI puro, que fue bien hasta que me di count de que el transpiler de Kotlin para JavaScript aún no es compatible con la reflexión, sin la cual no se puede hacer la dependency injection.

¿Alguien sabe los planes de JetBrains para apoyar la reflexión en su transpiler JavaScript en el futuro cercano? ¿O alguien sabe otra forma de escribir el código de Kotlin puro que usa dependency injection, y que aún puede ser transstackdo tanto a Java como a JavaScript? Este problema podría ser un stop-stop de Kotlin para mi proyecto, ya que no estoy seguro de si deseo volver a las fábricas configurables estáticas.

Apoyar la reflexión en el comstackdor de Kotlin a JavaScript es algo complicado. Lo peor es que tiene que almacenar metadatos de alguna manera en el file JS, lo que hace que el file JS sea grande, y a diferencia de JAR, que puede ser tan grande como sea necesario, es muy importante tener files JS pequeños. Además, debe agrupar el código que descompone estos metadatos y expone la API de reflexión, lo que hace que el código JS generado sea aún mayor.

No estoy seguro de si alguna vez se implementará la reflexión para el comstackdor de JS (o si lo hace, probablemente no sea la forma recomendada de implementar cosas como DI). Definitivamente no estará disponible en 1.1. En su lugar, podría haber otro enfoque similar a los generadores GWT, donde el desarrollador puede escribir complementos especiales de compilation y generar código para soportar cosas como serialization, RPC, DI, etc. Actualmente estamos experimentando con la serialization JSON, y generamos un serializador durante la compilation. hora. Si obtenemos buenos resultados, podríamos abrir nuestra API de complemento de compilation para que cualquier usuario pueda implementar cosas similares.

Además, tengo un proyecto de time libre que tiene un objective similar e implementa su propia API de metaprogtwigción que utilizo para implementar un gran subset de serializadores Jackson sin ninguna reflexión, así como los proxies de los clientes JAX-RS . Sin embargo, sigo fallando en presionar al rest del equipo de Kotlin para que adopte mis ideas y diseñe algo similar para el comstackdor de Kotlin.

Actualmente, no tiene nada más que usar el llamado "DI del pobre", ya que el IoC es principalmente un patrón de layout, no una biblioteca. Con las capacidades de Kotlin de crear DSL, creo que es posible crear algo agradable.

  • ¿Dónde / Cómo se agrega documentation para los packages de Kotlin?
  • Kotlin: Ordenando | Ubicación de la operación de intercambio
  • Error al ejecutar un proyecto de Android (escrito en Kotlin) comstackdo con el complemento Gradle2.0.0-alpha
  • Cuerda de relleno en Kotlin
  • Databinding y BaseObserver - Android MVVM
  • Kotlin no puede acceder a kotlin.jvm.functions.Function1 cuando llama a la function kotlin con java lambda
  • super.onCreateAnimation siempre devuelve null
  • Kotlin: ¿cómo usar múltiples generics en class?
  • ¿Por qué hay una diferencia entre los constructores de coroutine para CompletableFuture y ListenableFuture?
  • Cómo usar Kotlin coroutines await () en el hilo principal
  • La asignación de Firebase a Kotlin-Object no funciona