2016-12-27 108 views
3

我目前正在评估将大型Java/Swing应用程序移植到Kotlin。该应用程序的领域是二维图形,图形,图形编辑和模拟/动画。我想重写Kotlin中的整个应用程序核心,并将其转换为Java字节码以及JavaScript。我目前能够编写Kotlin绘图代码,使用一些适配器和桥接类在Java窗口和HTML画布中呈现这些代码。到现在为止还挺好。如何使用依赖于Kotlin的JavaScript进行依赖注入?

现在我正在努力使用依赖注入,我在应用程序中密切使用它。我想在我的Kotlin类中注入依赖,并且仍然能够将它们转换为JVM和JavaScript,所以我寻找了Kotlin的DI框架。我发现injektkodein,但看起来它们都依赖于JDK类,所以它们不适用于我的JavaScript用例。因此,我开始开发自己的纯Kotlin DI框架,直到我意识到JavaScript的Kotlin转换器还不支持反射,没有它,您不能进行依赖注入。

是否有人知道JetBrains计划在不久的将来支持JavaScript转译器中的反射?或者是否有人知道另一种编写使用依赖注入的纯Kotlin代码的方法,并且仍然可以将其转换为Java和JavaScript?这个问题可能会成为我的项目的Kotlin展示瓶塞,因为我不确定是否要回到静态可配置工厂。

回答

0

支持在Kotlin中对JavaScript编译器的反思是一件棘手的事情。最糟糕的是,你必须以某种方式将元数据存储在JS文件中,这使得JS文件变大,而不像JAR那样,JAR文件可以像需要那样大,所以拥有小JS文件是非常重要的。另外,你必须打包解压缩这些元数据的代码,并公开反射API,这使得生成的JS代码更大。我不确定反射是否会被JS编译器实现(或者如果它会的话,它可能不会被推荐用来实现像DI这样的东西)。它绝对不会在1.1中提供。相反,可能有另一种类似于GWT生成器的方法,开发人员可以编写特殊的编译器插件并生成一些代码来支持序列化,RPC,DI等等。目前,我们正在试验JSON序列化,并且在编译期间生成序列化器,时间。如果我们得到好的结果,我们可能会打开我们的编译器插件API,以便任何用户都可以实现类似的功能。

此外,我有一个有类似目标的业余时间项目,它实现了自己的metaprogramming API,我用它来实现large subset of Jackson serializer没有任何反射,以及JAX-RS client proxies。但是,我仍然没有推动剩下的Kotlin团队采纳我的想法并为Kotlin编译器设计类似的东西。

目前,除了使用所谓的“穷人的DI”之外,你什么都没有,因为IoC主要是设计模式,而不是图书馆。利用Kotlin创建DSL的功能,我相信可以创造出不错的东西。

+0

非常感谢您的精心解答,Alexey!关于JS反射的观点你完全正确。直到现在我还没有意识到他们。所以我会按照你的建议去使用“穷人的DI”(或者“Pure DI”),直到有人可能会根据你未来的编译器插件提供一个DI容器。祝你好运,试图说服你的团队伙伴关于你的元编程方法。感谢您在JetBrains的工作!在担任Java程序员20年之后,我现在喜欢Kotlin的编程,而我不想回去.. – andreasfl