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



我需要在CorDapp启动时启动并反对它,然后在不同的流中使用它。

我可能可以创建一个单例并使用"静态"伴随方法让这个对象在第一次调用时实例化它。但从Corda架构的角度来看,也许还有更正确的方式?像DI这样更有进取心的东西?或者至少在 onCreate()/onStart() 方法中,我可以做所有繁重的工作,以免让第一个客户等待?

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

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

节点中的单一实例对象称为服务。您可以通过在 CorDapp 中定义一个类来创建服务,该类:

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

例如:

@CordaService
class MyService(val services: ServiceHub) : SingletonSerializeAsToken() {
val myData = "someData"
fun myFunctionality(int: Int): String {
...
}
}

有关示例,请在此处查看 Oracle 示例。如果浏览此示例,你将看到它定义了一个仅安装在一个节点(即 oracle)上的服务。其他节点使用流查询服务以提取其数据。

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

serviceHub.cordaService(MyService::class.java)

最新更新