Akka.NET предоставляет API F #, который делает тривиальным определение актеров Akka как функций F # над почтовыми ящиками Akka. И до тех пор, пока все сообщения, обработанные актером, могут быть описаны с использованием единого дискриминационного объединения, ящик с активным типом. Проблема в том, что размещение всех определений сообщений в одном типе (дискриминационный союз) часто делает этот тип грязным: актер часто отвечает на сообщение разных категорий, например. сообщения, отправленные удаленными клиентами и сообщения, используемые во внутренних сообщениях. Например, актер может создавать внутренние задания и получать уведомления от внутренних компонентов. Это имеет смысл, чтобы определить эти внутренние сообщения, используя тип другой (внутренний), но затем chages почтового ящика актера уже не может быть сильным типом, и функция взгляд актера, как это:Как определить функции актера F #, чтобы избежать бокса сообщений?
let rec loop() =
actor {
let! message = mailbox.Receive()
match box message with
| :? PublicMessage as msg -> handlePublicMessage msg
| :? PrivateMessage as msg -> handlePrivateMessage msg
| _ -> raise (InvalidOperationException(sprintf "Invalid message type %A" message))
return! loop()
}
loop()
Что мне не нравится в том, что это подход забирает одну из основных сил F #: тип вывода. Вместо этого мы должны вводить сообщения для преобразования их в тип объекта, а затем приводить их к типам, которые мы ожидаем.
Есть два варианта этого подхода:
- Всегда перечислить все случаи сообщений в рамках одного типа. Плохо, плохо, плохо.
- Определите тип актера для типа сообщения. ИМХО это может оказаться даже достойным, потому что решение о создании нового типа актера не должно быть обусловлено специфическими языковыми ограничениями.
Я проверил код из загрузочного диска Akka.NET, и они используют первый подход - с бокс-сообщением и литьем сообщений. Это лучшее, что можно сделать?
У меня нет опыта работы с Akka.NET. Если единственная проблема заключается в смешивании публичных и частных типов сообщений, разрешено ли вам использовать вложенный дискриминированный союз? то есть. type Message = Public of PublicMsg | Частный PrivateMsg; где PublicMsg и PrivateMsg являются отдельными отдельными профсоюзами. – piaste