Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 这个异步参与者初始化习惯用法有名字吗?_Asynchronous_Design Patterns_Initialization_Akka_Actor - Fatal编程技术网

Asynchronous 这个异步参与者初始化习惯用法有名字吗?

Asynchronous 这个异步参与者初始化习惯用法有名字吗?,asynchronous,design-patterns,initialization,akka,actor,Asynchronous,Design Patterns,Initialization,Akka,Actor,每当我创建一个需要一些异步获取的数据来初始化自身的actor时,我发现自己使用了这样一个习惯用法。它有名字吗?(这是最好的方法吗?) 类AsyncInitActor(db:Database,someId:UUID)使用ActorStash扩展了Actor{ case类初始化(something:something) 覆盖def preStart()={ db.getSomething(someId)onSuccess{something=> 自我初始化(某事) } } def接收={ 案例初始化

每当我创建一个需要一些异步获取的数据来初始化自身的actor时,我发现自己使用了这样一个习惯用法。它有名字吗?(这是最好的方法吗?)

类AsyncInitActor(db:Database,someId:UUID)使用ActorStash扩展了Actor{
case类初始化(something:something)
覆盖def preStart()={
db.getSomething(someId)onSuccess{something=>
自我初始化(某事)
}
}
def接收={
案例初始化(某物)=>
上下文被初始化(某物)
unstashAll()
案例=>stash()
}
def已初始化(某物):接收={
大小写=>
}
}
对于通过集群分片创建的参与者,异步请求发生在
receive
中,而不是
preStart


说清楚,我不是在寻找GoF模式。

我想到的最接近的设计模式是代理

根据文件:

设计一个代理对象,或代理对象:当客户端第一次请求代理时实例化真实对象,记住这个真实对象的身份,并将煽动请求转发给这个真实对象。然后,所有后续请求直接转发到封装的真实对象

在您的例子中,您可以想象演员被代理包装。一旦参与者从数据库初始化,代理将所有请求转发给它,即真正的参与者。在此之前,代理将返回null、默认actor或其他内容

每当我创建一个需要异步获取的参与者时 要初始化的数据本身

我会说,你基本上描述了一个工厂模式。如果您的参与者是DDD概念,那么它将位于DDD存储库的上下文中。换句话说,您正在处理一个实体的复杂创建及其验证-需求部分。DDD存储库的职责之一是生成有效的聚合根

我的两分钱

塞吉伊


我从来没有用过这个藏品。如果我真的需要初始化,我更可能使用FSM来确保我的参与者处于就绪状态


我想你可以把这两种方法结合起来。

不,这不是工厂模式。我正在为这个特定的异步模式寻找一个名称。也许最好称之为成语。我不太清楚你在这里的意图。操作的异步性不会改变意图。意图定义了模式。根据定义,模式解决了重复出现的问题。你把它改成成语的事实并没有消除它的本质。在您的例子中,这是一个有效参与者的多步骤创建。我的目的是找出参与者异步初始化的这个特定习惯用法是否有一个名称。打电话给工厂并不意味着这就是正在发生的事情。不,这不是代理。参与者没有将请求转发给另一个参与者,它只是将自己处理的请求延迟到初始化之后。您可以这样设计它,即包装器等待初始化并相应地转发请求。您能举个例子吗?如果您没有隐藏到达起始状态的消息,您会如何处理它们?我认为隐藏就是为了这个目的。当然,您也可以存储在actor状态。坦白地说,我通常会使用FSM在行为被“变成”更改为某种就绪状态之前拒绝其他消息。在演员准备好之前,我不太需要接受信息。这是另一个例子。