Best Practices работы с web api + akka.net

Я гуглил этот вопрос в интернете, но я хочу узнать мнение других людей

Какие есть лучшие практики для работы с 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

Ответы (0 шт):