Какие есть лучшие практики для работы с akka.net в среде asp.net web api? Что меня конкретно интересует:
ActorFactory
Нормальна ли практика создания вот такого класса:
public sealed class ActorFactory
{
private readonly Akka.Actor.ActorSystem _actorSystem;
public ActorFactory(Akka.Actor.ActorSystem actorSystem)
{
_actorSystem = actorSystem;
}
public IActorRef GetOrCreate<T>() where T : ActorBase => _actorSystem.ActorOf(Props.Create<T>());
}
Далее этот класс регистрируется как
services.AddSingleton<ActorFactory>()
, что даёт мне возможность получить его через DI на уровне контроллеров. Но есть ли в этом смысл? Нормально ли так вообще делать?
IHostedService акторы
Видел примеры, в том числе и в официальной документации, вот таких актеров:
public class AkkaService : IPublicHashingService, IHostedService
{
private ActorSystem _actorSystem;
// ...
}
Есть ли смысл делать именно вот так, или лучше использовать обычный сервисный подход, что бы актеры создавались только тогда, когда они должны вызываться?
Акторы и Dependency Injection (1)
Можно ли как-то указать, какого конкретного актера я хочу получить через DI на уровне контроллеров? Конкретно тут, я понимаю, что мне нужно как-то их различать по типу, что бы запросить его. Если я буду запрашивать обычный
IActorRef
, имею примерно такой код:
public MyController : ControllerBase
{
private readonly IActorRef _authenticationActor;
public MyController(IActorRef authenticationActor)
{
_authenticationActor = authenticationActor;
}
}
В таком случае система, просто не поймёт, какой именно актер мне нужен. Значит я могу тут использовать какой-то
ActorFactory
и уже через него получить нужного актера, но тут мы возвращаемся к первому пункту, как это правильно реализовать.
Акторы и Dependency Injection (2)
Как получить внутри актеров другие сервисы, допустим, тот же
GenericRepository<>
? Для этого, актер должен быть как минимум таком же
.AddScoped<>
. Отсюда два варианта:
- Способ регистрировать актеров напрямую в DI используя сервисных подход
- Использовать
ActorService
, который реализует IHostedService
, внутри которого воздавать scope
через IServiceCollection