Ich versuche Dependency Injection mit Akka .NET einzurichten. Nach einem Plural Kurs zum Thema, kam ich mit folgenden Anpassung nach oben:Wie wird die Abhängigkeitsinjektion in Ninject eingerichtet?
var container = new StandardKernel();
container.Bind<ITimeService>().To<LocalTimeService>();
container.Bind<TimeLordActor>().ToSelf();
using (var actorSystem = ActorSystem.Create("MyActorSystem"))
{
var resolver = new NinjectDependencyResolver(container, actorSystem);
var actor = actorSystem.ActorOf(Props.Create<TimeLordActor>(),
"TimeLordActor");
actor.Tell("Give me the time!");
Console.WriteLine("Press ENTER to exit...");
Console.ReadLine();
}
TimeLordActor Konstruktor einen Parameter des Typs erwartet ITimeService
.
Allerdings bekomme ich die folgende Fehlermeldung beim Laufen:
[ERROR][7/10/2016 5:39:42 PM][Thread 0012][akka://MyActorSystem/user/TimeLordActor] Error while creating actor instance of type AkkaNetDiExperimental.TimeLordActor with 0 args:() Cause: [akka://MyActorSystem/user/TimeLordActor#1586418697]: Akka.Actor.ActorInitializationException: Exception during creation ---> System.TypeLoadException: Error while creating actor instance of type AkkaNetDiExperimental.TimeLordActor with 0 args:() ---> System.MissingMethodException: Constructor on type 'AkkaNetDiExperimental.TimeLordActor' not found. at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark) at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) at System.Activator.CreateInstance(Type type, Object[] args) at Akka.Actor.Props.ActivatorProducer.Produce() at Akka.Actor.Props.NewActor() --- End of inner exception stack trace --- at Akka.Actor.Props.NewActor() at Akka.Actor.ActorCell.CreateNewActorInstance() at Akka.Actor.ActorCell.<>c__DisplayClass118_0.<NewActor>b__0() at Akka.Actor.ActorCell.UseThreadContext(Action action) at Akka.Actor.ActorCell.NewActor() at Akka.Actor.ActorCell.Create(Exception failure) --- End of inner exception stack trace --- at Akka.Actor.ActorCell.Create(Exception failure) at Akka.Actor.ActorCell.SysMsgInvokeAll(EarliestFirstSystemMessageList messages, Int32 currentState)
Die offizielle Dokumentation zu Akka .NET Dependency Injection schlägt vor, dass Sie eine DI() Erweiterungsmethode auf der ActorSystem Instanz verwenden sollen, wenn Akteure direkt erstellen:
// Create the Props using the DI extension on your ActorSystem instance
var worker1Ref = system.ActorOf(system.DI().Props<TypedWorker>(), "Worker1");
var worker2Ref = system.ActorOf(system.DI().Props<TypedWorker>(), "Worker2");
Allerdings konnte ich nicht finden, diese Erweiterung Methode auf dem Aktor-System.
Kann jemand bitte erklären, wie man einen einfachen Akteur herstellt, der Abhängigkeitsinjektion vom Aktorsystem selbst verwendet?