1) Является ли эта архитектура целесообразной?
Это, конечно, не плохой подход :)
Главное, что я бы беспокоиться о том, как она влияет на других членов команды - они будут нужны, чтобы выучить новый язык, чтобы добавить новые функции или проблемы с отладкой? Если остальной части вашей команды не удобно использовать его, вы можете захотеть рассмотреть или создать свою собственную библиотеку передачи сообщений в C#.
2) Если да, то есть ли какие-либо примеры из там, которые демонстрируют лучший практики подход к этой конструкции?
Мне нравится смешивать F # и C# в моих проектах все время. По моему собственному опыту, использование C# dll из F # намного проще, чем наоборот. Большинство конструкций, которые мы хотели бы использовать в F #, выглядят смешно и неинтуитивно для C#. Только для funsies, увидеть, как следующий код делает в Рефлектор:
let f x y z = x(y z)
let (|A|B|C|) x =
match x with
| 1 -> A
| 2 -> B
| x -> C x
type whatever = X | Y | Z of int
функции визуализации карри как FSharpFunc
, активные модели имеют забавное название и тип возвращаемого значения, профсоюзы имеют очень странный набор членов и т.д. Они смотрят странно в C#, поэтому вы, скорее всего, захотите предоставить фасад с более приятной подписью C# для любых модулей, которые вы ожидаете публично использовать. Например:
module CSharpFacade =
let f(x : System.Func<_, _>, y : System.Func<_, _>, z) = f (fun param -> x.Invoke(param)) (fun param -> y.Invoke(param)) z
[<AbstractClass>]
type Whatever() =
inherit obj()
abstract member Map : unit -> whatever
type X() =
inherit Whatever()
override this.Map() = whatever.X
type Y() =
inherit Whatever()
override this.Map() = whatever.Y
type Z(value : int) =
inherit Whatever()
member this.Value = value
override this.Map() = whatever.Z(value)
Таким образом, его довольно прямолинейно завернуть делегаты и союзы F # для C#. Я действительно не хочу раскрывать активную структуру, она будет внутренней, если не потребуется иное.
И вы можете обернуть некоторые типы/None в чем-то более приемлемым, например, использование Nullable<someValueType>
вместо Option<someValueType>
и отображения null
типа ссылки на None
, где это необходимо, и т.д.
В общем, избежать всех F # -специфические конструкции на границах сборки, когда вы хотите потреблять сборки F # с других языков. – Brian