Как использовать инъекцию зависимостей с помощью Kotlin для таргетинга JavaScript?

В настоящее время я оцениваю перенос большого приложения Java / Swing в Kotlin. Областью применения является 2D-графика, графики, графическое редактирование и симуляция / анимация. Я хочу переписать весь ядро ​​приложения в Kotlin и перевести его на байт-код Java, а также на JavaScript. В настоящее время я могу написать код рисования Kotlin, который отображает как в окне Java, так и в холсте HTML, используя некоторые классы адаптера и моста. Все идет нормально.

Теперь я борюсь с инъекцией зависимости, которую я интенсивно использую в своем приложении. Я хочу добавить зависимости в своих классах Kotlin и все еще иметь возможность передавать их в JVM и JavaScript, поэтому я искал рамки DI для Kotlin. Я нашел injekt и kodein , но похоже, что оба они полагаются на классы JDK, поэтому они не применимы для моего использования JavaScript. Поэтому я начал разрабатывать свою собственную чистую инфраструктуру Kotlin DI, которая прошла хорошо, пока я не понял, что транспилятор Kotlin для JavaScript еще не поддерживает рефлексию, без которой вы не можете делать инъекции зависимостей.

Кто-нибудь знает планы JetBrains поддержать размышления в их трансилере JavaScript в ближайшем будущем? Или кто-нибудь знает другой способ написания чистого кода Котлина, который использует инъекцию зависимостей, и который все еще может быть передан как на Java, так и на JavaScript? Эта проблема может оказаться пробной пробкой Kotlin для моего проекта, так как я не уверен, хочу ли я вернуться к статическим настраиваемым фабрикам.

Поддержка рефлексии в Kotlin для компилятора JavaScript – сложная вещь. Хуже всего то, что вам нужно каким-то образом хранить метаданные в JS-файле, что делает JS-файл большим, и в отличие от JAR, который может быть как можно большим, очень важно иметь небольшие JS-файлы. Кроме того, вам необходимо связать код, который распаковывает эти метаданные и предоставляет API-интерфейс отражения, что делает сгенерированный JS-код еще большим.

Я не уверен, что когда-либо будет реализовано отражение для JS-компилятора (или, если это произойдет, скорее всего, не будет рекомендован способ реализовать такие вещи, как DI). Это определенно не будет доступно в 1.1. Вместо этого может возникнуть другой подход, похожий на генераторы GWT, где разработчик может писать специальные плагины компилятора и генерировать некоторый код для поддержки таких вещей, как сериализация, RPC, DI и т. Д. В настоящее время мы экспериментируем с сериализацией JSON и генерируем сериализатор во время компиляции, время. Если мы получим хорошие результаты, мы можем открыть наш API-интерфейс для компилятора, чтобы любой пользователь мог реализовать подобные вещи.

Кроме того, у меня есть проект свободного времени, который имеет аналогичную цель, и он реализует свой собственный API метапрограммирования, который я использую для реализации большого подмножества сериализатора Jackson без каких-либо отражений, а также для прокси-серверов JAX-RS . Тем не менее, я все еще не могу заставить оставшуюся команду Kotlin принять мои идеи и разработать что-то подобное для компилятора Kotlin.

В настоящее время у вас нет ничего, кроме использования так называемого «бедного человека DI», поскольку IoC – это в основном шаблон дизайна, а не библиотека. С возможностями Kotlin создания DSL я считаю, что можно создать что-то приятное.