我需要在CorDapp启动时对其进行启动和对象,然后在不同的流程中使用它。
我可能可以创建一个单例并使用'static'伴随方法来让这个对象在第一次调用时实例化它。但是从Corda架构的角度来看,或许还有更正确的方法吗?像DI这样更有进取心的东西?或者至少onCreate()/ onStart()方法,我可以做所有繁重的工作,不要让第一个客户等待?
答案 0 :(得分:0)
CorDapp 本身不能包含单个对象。每个节点都是独立的Java进程,它们不能在彼此之间共享对象。因此,您必须遵循以下模式之一:
节点中的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)