AK1000 - Error
Do not use the new
keyword to create Akka.NET actors.
Cause
A class inheriting from Akka.Actor.ActorBase
or one of its descendants was instantiated directly via the new
keyword, which is illegal. Actors can only be instantiated inside a Props.Create
method or via an IIndirectActorProducer
implementation (such as Akka.DependencyInjection
.)
An example:
using Akka.Actor;
class MyActor : ActorBase {
protected override bool Receive(object message) {
return true;
}
}
class Test
{
void Method()
{
MyActor actorInstance = new MyActor(); // not supported by Akka.NET
}
}
Resolution
The correct way to get a reference back to an actor is to wrap your actor's constructor call inside a Props.Create
method and then pass that into either ActorSystem.ActorOf
(when creating a top-level actor) or Context.ActorOf
(when creating a child actor.)
Here's an example below:
using Akka.Actor;
class MyActor : ReceiveActor {
private readonly string _name;
private readonly int _myVar;
public MyActor(string name, int myVar){
_name = name;
_myVar = myVar;
ReceiveAny(_ => {
Sender.Tell(_name + _myVar);
});
}
}
class Test
{
void Method()
{
// obviously, don't create a new ActorSystem every time - this is just an example.
ActorSystem sys = ActorSystem.Create("MySys");
Akka.Actor.Props props = Akka.Actor.Props.Create(() => new MyActor("foo", 1));
IActorRef realActorInstance = sys.ActorOf(props);
}
}