F#:淡化API的最佳方法?

时间:2009-04-07 05:34:39

标签: api fluent-nhibernate f# fluent-interface

我正在扩展Fluent NHibernate以便更好地使用F#(即报价支持),并希望获得一些关于解冻API的反馈。 F#要求使用返回值,除非它们是类型单位。因此,这最终会以“|> ignore”终止每一行:

type ProductMap() as m = inherit QClassMap<Product>() do
    let x = Unchecked.defaultof<Product> 
    m.Id <@ x.Id @> |> ignore
    m.Map <@ x.Name @> |> ignore
    m.Map <@ x.Price @> |> ignore
    (m.HasManyToMany <@ seq x.StoresStockedIn @>)
        .Cascade.All()
        .Inverse()
        .WithTableName("StoreProduct") |> ignore

我的第一反应是向基类添加更多方法,以便返回单元。例如,“IdI”和“MapI”:

...
m.IdI <@ x.Id @>
m.MapI <@ x.Name @> 
m.MapI <@ x.Price @> 
... 

但这需要特定的重载,而且长链仍然需要一个|&gt;忽视。我还考虑使用Done属性扩展对象:

(m.Id <@ x.Id @>).Done
(m.Map <@ x.Name @>).Done
(m.Map <@ x.Price @>).Done
(m.HasManyToMany <@ seq x.StoresStockedIn @>)
    .Cascade.All()
    .Inverse()
    .WithTableName("StoreProduct").Done

您怎么看?

1 个答案:

答案 0 :(得分:4)

恕我直言,更好的方法是从头开始在F#中思考(例如功能管道,曲线,组合器)而不是包裹流畅的nhibernate,使用流利的nhibernate用于生成映射。也就是说,建立一个“平行流利的nhibernate”专用于F#。

recently posted关于Windsor在F#中流畅的界面的类似问题。我的结论是,为C#/ VB.NET构建的许多DSL /流畅接口将在F#中破解,因此我认为最好构建适合F#方式的特定流畅接口。