Architecture 将F#集成到现有的.Net应用程序中

Architecture 将F#集成到现有的.Net应用程序中,architecture,f#,Architecture,F#,我感兴趣的是将F#在并行领域的优势应用到现有的.Net应用程序中。也就是说,我想考虑一个F#组件,它只处理应用程序的并发消息传递,而保留现有的大部分.Net项目。现有的应用程序将调用F#组件 1) 这种架构可取吗? 2) 如果是这样,是否有任何示例可以证明此设计的最佳实践方法 谢谢 约翰这无疑是解决这个问题的有效方法。这与将应用程序的任何部分分解到单独的类库中没有什么不同。此过程的任何最佳实践都应适用于新DLL的语言,即F# 无耻的自我宣传如下: 如果您正在寻找采用这种方法的真实世界示例,那么需

我感兴趣的是将F#在并行领域的优势应用到现有的.Net应用程序中。也就是说,我想考虑一个F#组件,它只处理应用程序的并发消息传递,而保留现有的大部分.Net项目。现有的应用程序将调用F#组件

1) 这种架构可取吗? 2) 如果是这样,是否有任何示例可以证明此设计的最佳实践方法

谢谢


约翰这无疑是解决这个问题的有效方法。这与将应用程序的任何部分分解到单独的类库中没有什么不同。此过程的任何最佳实践都应适用于新DLL的语言,即F#

无耻的自我宣传如下:

如果您正在寻找采用这种方法的真实世界示例,那么需要查看的一个项目就是该项目。它是Visual Studio的Vim仿真器,其核心功能依赖于F#,但使用C#集成到Visual Studio中

它可能不包含所有的最佳实践,但它确实包含了一些在C#或VB.Net等语言中使用的F#构造的示例。特别是选择权和歧视性工会

1) 这种架构可取吗

这当然不是一个坏方法:)

我最担心的是它会如何影响团队中的其他成员——他们是否需要学习一种新语言来添加新功能或调试问题?如果你的团队其他成员不舒服地使用它,你可能会考虑在C语言中寻找或建立自己的消息传递库。 2) 如果有的话,有什么例子吗 这是一个最好的例子 这种设计的实践方法

我喜欢在我的项目中始终混合F和C。根据我自己的经验,从F#中利用C#DLL要比从F#中利用C#DLL容易得多。我们喜欢在F#中使用的大多数结构在C#中看起来既有趣又不直观。为了好玩,请参见以下代码在Reflector中的渲染方式:

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
Curried函数呈现为
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(x:System.Func,y:System.Func,z)=f(fun-param->x.Invoke(param))(fun-param->y.Invoke(param))z
[]
键入Whatever()=
继承obj()
抽象成员地图:单位->任何
X型()=
继承一切
重写此.Map()=任意.X
类型Y()=
继承一切
重写此.Map()=任意.Y
类型Z(值:int)=
继承一切
成员。值=值
重写此.Map()=任意.Z(值)
因此,将F代表和C代表的工会总结起来是非常直接的。我真的不想公开活动模式,除非另有需要,否则它将是内部的

您可能希望将一些/None类型包装成更容易接受的格式,例如使用
null
代替
选项,并在需要时将
null
引用类型映射到
None
,等等,当您想使用来自其他语言的F程序集时,请避免在程序集边界处使用所有特定于F的构造。