Scala 斯卡拉猫&x27;OSGi上下文中的IOApp

Scala 斯卡拉猫&x27;OSGi上下文中的IOApp,scala,functional-programming,osgi,scala-cats,io-monad,Scala,Functional Programming,Osgi,Scala Cats,Io Monad,我目前正在开发的一个应用程序是以函数式编程风格编写的,使用' 现在的问题是,我需要在OSGi上下文中部署这个应用程序,而这个上下文似乎并不真正适合我的功能方法 我的主要方法如下所示: objectmain扩展IOApp{ 覆盖def运行(args:List[String]):IO[ExitCode]=for{ _这里没有办法避免一些令人讨厌的Java风格代码,OSGi就是这样工作的。但是你可以做的是在可重用类中隐藏不好的地方,所以你只需要正确地处理一次,再也不要看它了。我的建议是一个通用的激活器

我目前正在开发的一个应用程序是以函数式编程风格编写的,使用'

现在的问题是,我需要在OSGi上下文中部署这个应用程序,而这个上下文似乎并不真正适合我的功能方法

我的主要方法如下所示:

objectmain扩展IOApp{
覆盖def运行(args:List[String]):IO[ExitCode]=for{

_这里没有办法避免一些令人讨厌的Java风格代码,OSGi就是这样工作的。但是你可以做的是在可重用类中隐藏不好的地方,所以你只需要正确地处理一次,再也不要看它了。我的建议是一个通用的激活器,它将在启动时获取一个cats
资源,并在你把它关掉

class ResourceActivator(资源:BundleContext=>resource[IO,Unit])
扩展BundleActivator{
私有变量清理:IO[Unit]=null
覆盖def启动(上下文:BundleContext):单位=
cleanup=resource(context).allocate.unsafeRunSync()。\u 2
覆盖def停止(上下文:BundleContext):单位=
cleanup.unsafeRunSync()
}
有效的OSGi实现不会在不首先调用
start
的情况下调用
stop
,因此可以将
cleanup
初始化为
null

请注意,上面的类很容易让您在
start
方法中启动一些非同步计算,然后在
stop
方法中关闭它:

MyActivator类扩展了ResourceActivator(ctx=> 为了{
RES1考虑制作一个自定义<代码>猫。效果。资源< /代码>代表捆绑激活器'',我仍然明白你为什么使用<代码> var >代码>和<代码>选项>代码> .<代码> IO < /COD>是懒惰的。@你所说的“V”灯真的没有意义。你必须指向清单中的激活器,所以代码> RESULL在哪里?ce
进来了吗?IO的惰性与这里使用的
var
选项有什么关系?我的评论是在编辑显示
packageOptions
之前,我现在明白了这是没有意义的:)只是想澄清一下:上面的代码工作得非常好!在我看来,这还不够“纯粹”/FP。