2010-06-09 3 views
3

Я заинтересован в использовании сильных сторон F # в области параллелизма в существующем приложении .Net. То есть, я хотел бы включить компонент F #, который будет обрабатывать только одновременную передачу сообщений моего приложения, оставив большую часть моего существующего проекта .Net как есть. Существующее приложение будет обращаться к компоненту F #.Интеграция F # в существующее .Net-приложение

1) Является ли эта архитектура целесообразной? 2) Если да, есть ли какие-либо примеры, демонстрирующие подход к этой разработке с лучшей практикой?

Спасибо,

Джон

ответ

4

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, где это необходимо, и т.д.

+2

В общем, избежать всех F # -специфические конструкции на границах сборки, когда вы хотите потреблять сборки F # с других языков. – Brian

4

Это, конечно, обоснованный подход к проблеме. Это ничем не отличается от факторизации любой части вашего приложения в отдельной библиотеке классов. Любые передовые методы с этим процессом должны относиться к языку новой DLL, являющейся F #.

Shameless Само Promo Внизу:

Если вы ищете реальные примеры, что этот подходу один проект, чтобы посмотреть на это VsVim проекта. Это эмулятор Vim для Visual Studio, который полагается на F # для его основной функциональности, но использует C# для интеграции в Visual Studio.

Он может не содержать всех лучших практик, но содержит примеры работы над некоторыми конструкциями F #, которые могут быть нечеткими для использования на таких языках, как C# или VB.Net. В частности, варианты и дискриминационные союзы.

Смежные вопросы