首页 > 解决方案 > 从 ActorSystem 或 Context (Akka.NET) 按名称获取演员

问题描述

是否可以检查 ActorSystem 中是否存在演员?
我只是不想将 IActorRef 引用传递给每个演员的构造函数,并希望有类似 GetOrCreate 方法来实例化所需的演员。所以它可能就像我会在整个演员系统中使用的单例演员。

标签: actorakka.net

解决方案


您可以使用ActorSelection检查是否存在任何参与者,以要求其识别自己:

var selection = Context.ActorSelection(actorPath);
/// if there's no actor, this operation can timeout
var reply = await selection.Ask<ActorIdentity>(new Identify(null), timeout);

虽然这适用于任何地方,甚至跨越网络边界,但您不能“仅仅”从任何地方创建一个演员。为了被创建,actor需要一个父级——一个actor系统或者另一个actor。

获取或创建逻辑可以很简单地从演员内部完成:

IActorRef GetOrCreate(string childName)
{
    var child = Context.Child(childName);
    if (Equals(child, ActorRefs.Nobody))
        child = Context.ActorOf(Props.Create(() => new ChildActor()), childName);
    return child;
}

如果您需要使其在分布式环境中工作,此功能由Akka.Cluster.Sharding插件提供。


推荐阅读