Правильный шаблон для сохранения творчества детей-актеров

Каков правильный шаблон для постоянного создания дочернего субъекта (если он не существует) и отправки ему сообщения?

Наш подход пока такой, как показано ниже - в идеале мы бы создали дочерний актер внутри этого действия делегата 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;
}

}

0 ответов

Другие вопросы по тегам