February 5th, 2020

Book

Абстрактная фабрика синглтонов

Вот уж не думал, что когда-нибудь буду всерьёз предлагать сабж.

Но мы тут делаем пилотный проект сервиса на C#, Dotnet Core, Akka.Net и Linux.

Код пока очень сырой, мы больше рефакторим, чем реально пишем, поскольку непонятно, как перекрутить свои мозги для акки. На то он и пилотный проект. И всё ещё усугубляется тем, что в акке акторы дебильные, по сравнению с Эрлангом - например, нет блокирующих вызовов. Дотнетовская акка - копия джавовской.

Ну и нам понадобился HTTP-клиент. Как его делать "на акторах"?

Я решил, что основной принцип - актор на каждый чих. То есть, HttpClient.Get выглядит так (у нас на самом деле пока не так, но не суть важно):

1. Cоздать HttpActor, параметры запроса - параметры конструктора.
2. Дождаться от него сообщения

Так вот, нам приспичило писать тесты. Ну то есть без тестов вообще ничего более-менее сложного написать нельзя, и наш прототип достиг той фазы, когда хорошо бы написать что-то дабы избежать ручных тестовых прогонов.

Для этого очень хочется мокать HttpClient. Но я хочу мокать не хелпер-класс HttpClient, а актор HttpActor. Преимущество - в том что акторы нетипизированные и не надо будет лепить IHttpActor, HttpActor и MockHttpActor.

Ну и у нас "because we can" подключен AutoFac DI, так что хочется как-то задействовать его.

Так что я нашёл на гитхабе репу, которая делает то что мы хотим: мокает дочерний актор.

Но делает она его, мамочки!

https://github.com/sachabarber/AkkaNetDITesting

Усугубляется это тем, что для нужд перезапуска акторов нужно уметь заново вызывать старый конструктор со старыми параметрами, для чего в Акке есть свои фабрики. Ну и получается что акковские фабрики сидят на аутофаковских фабриках и акторами погоняют.

Решили запилить минимальный пример в духе этой репы, но попробовать сократить количество бойлерплейта и параметризации. Например, в автофаке есть named services:

https://autofac.readthedocs.io/en/latest/advanced/keyed-services.html

Ну и получится пирамида из фабрик всё равно, но с меньшим количеством хелпер-классов. Будет автофаковская именованная фабрика акковских фабрик.

Есть ещё трёхэтажный вариант с аутофаковской фабрикой абстрактных фабрик акковских фабрик. Но надеемся что до этого дело не дойдёт.

В-общем я бы конечно хотел отказаться от всего этого говна и сделать на го. Но нет!