Правильный шаблон для сохранения творчества детей-актеров
Каков правильный шаблон для постоянного создания дочернего субъекта (если он не существует) и отправки ему сообщения?
Наш подход пока такой, как показано ниже - в идеале мы бы создали дочерний актер внутри этого действия делегата Persist (как показано ниже), но можем ли мы быть уверены, что IActorRef будет создан, когда метод вернется?
public class DispatcherActor : ReceivePersistentActor
{
public static Props Props() => Akka.Actor.Props.Create<DispatcherActor>();
public DispatcherActor()
{
Command<IIdentityCommand>(m =>
{
// Intended that this returns an existing or created child actor...
IActorRef identityActor = GetOrBuildIdentityActor(m);
identityActor.Tell(m);
});
}
private IActorRef GetOrBuildIdentityActor(IIdentityCommand msg) =>
Equals(Context.Child(IdentityActor.Path(msg.IdentityNumber)), ActorRefs.Nobody)
? CreateAndPersistIdentityActor(msg)
: Context.Child(IdentityActor.Path(msg.IdentityNumber));
private IActorRef CreateAndPersistIdentityActor(IIdentityCommand msg)
{
Persist(new IdentityActorCreatedEvent(msg.IdentityNumber), @event =>
{
//Can we get an IActorRef from within the persist delegate?
Context.ActorOf(Context.DI().Props<IdentityActor>(), IdentityActor.Path(@event.IdentityNumber));
});
// Will the Child Actor necessarily have been created when this function returns?
return Context.Child(IdentityActor.Path(msg.IdentityNumber));
}
public override string PersistenceId => Self.Path.Name;
}
}