Я использую Akka.NET в службе Windows (с верхней полкой и автофаком, но этот подход должен работать для любого исполнителя службы и инфраструктуры IoC). Я запускаю актера верхнего уровня в методе запуска службы следующим образом:
_scope.Resolve<ActorSystem>().ActorOf<MyTopLevelActor>().Tell(new StartMySystemMessage());
Оттуда я создаю дочерних актеров с помощью
var actorWithoutDependencies = Context.ActorOf<ChildActorType>();
где тип актора имеет конструктор по умолчанию, или
var actorWithDependencies = Context.ActorOfDI<ChildActorType>();
где тип дочернего актора имеет зависимости.
Вызовы ActorOfDI — это методы расширения, которые я использую для переноса методов ActorSystem.DI() и IActorContext.DI() в akka.net следующим образом:
public static IActorRef ActorOfDI<T>(this ActorSystem actorSystem, string name = null) where T : ActorBase
{
return actorSystem.ActorOf(actorSystem.DI().Props<T>(), name);
}
public static IActorRef ActorOfDI<T>(this IActorContext actorContext, string name = null) where T : ActorBase
{
return actorContext.ActorOf(actorContext.DI().Props<T>(), name);
}
Что касается конфигурации IoC для акторов, я регистрирую все типы акторов в сборках, содержащих акторы (используя Autofac), следующим образом:
containerBuilder.RegisterAssemblyTypes(typeof(SomeActorType).Assembly).Where(x => x.Name.EndsWith("Actor"));
а для регистрации самой системы акторов делаю так:
containerBuilder.Register(c =>
{
var system = ActorSystem.Create("MyActorSystem");
// ReSharper disable once ObjectCreationAsStatement
new AutoFacDependencyResolver(lazyContainer.Value, system);
return system;
}).As<ActorSystem>().SingleInstance();
где lazyContainer - это:
Lazy<IContainer> // this is an autofac type
и делегат конструктора вызывает
containerBuilder.Build() // this is an autofac call
Чтобы получить акторную систему из другого класса с внедренной зависимостью, вы можете просто передать ActorSystem в конструктор класса. Я не уверен в получении ссылки на системного актера в коде моего приложения — мне не нужно было делать это самому.
person
Steve Willcock
schedule
04.02.2016