在 CorDapp 启动时实例化对象并在 Corda 流程中进一步使用它的正确方法是什么?

What is the correct way to instantiate object on CorDapp start and use it further in Corda flows?

我需要在 CorDapp 启动时在其内部启动和对象,然后在不同的流程中使用它。

我可能可以创建一个单例并使用 'static' 伴随方法来让这个对象在第一次调用时实例化它。但从 Corda 架构的角度来看,也许有更正确的方法?像 DI 这样更具企业精神的东西?或者至少是 onCreate()/onStart() 方法,我可以在其中完成所有繁重的工作,以免让第一位客户等待?

你不能在 CorDapp 本身中有一个单例对象。每个节点都是一个独立的 Java 进程,它们之间不能共享对象。因此,您必须遵循以下模式之一:

  • 您的 CorDapp 定义了一个单例对象,您将其安装在多个节点上。每个节点都有自己的单例对象
  • 你的CorDapp定义了一个单例对象,你只安装在一个节点上。当其他节点想要访问单例对象的功能或数据时,它们通过使用流与持有单例对象的节点来回发送数据来实现

节点中的单例对象称为服务。你通过在你的 CorDapp 中定义一个 class 来创建一个服务:

  • 采用ServiceHub
  • 类型的单个构造函数参数
  • @CordaService注释
  • 扩展 SingletonSerializeAsToken class

例如:

@CordaService
class MyService(val services: ServiceHub) : SingletonSerializeAsToken() {

    val myData = "someData"

    fun myFunctionality(int: Int): String {
        ...
    }
}

例如,请查看 Oracle 示例 here。如果您研究这个示例,您会发现它定义了一个只安装在一个节点上的服务,即 oracle。其他节点使用流查询服务以提取其数据。

要在流中获取对服务(即单例对象)的引用,请使用以下语法:

serviceHub.cordaService(MyService::class.java)