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

时间:2018-01-26 14:10:07

标签: corda

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

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

1 个答案:

答案 0 :(得分:0)

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

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

节点中的Singleton对象称为 services 。您可以通过在CorDapp中定义一个类来创建服务:

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

例如:

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

    val myData = "someData"

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

举个例子,看看Oracle示例here。如果您浏览此示例,您将看到它定义了一个仅安装在一个节点oracle上的服务。其他节点使用流来查询服务以提取其数据。

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

serviceHub.cordaService(MyService::class.java)