NikFaraday
@NikFaraday
Student full-stack Developer

Какие 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
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 1
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы