【问题标题】:F#: Best way to de-fluent an API?F#:去流畅化 API 的最佳方式?
【发布时间】:2009-04-07 05:34:38
【问题描述】:

我正在扩展 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 @> 
... 

但这需要特定的重载,长链仍然需要|>忽略。我还考虑过使用 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

你怎么看?

【问题讨论】:

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


    【解决方案1】:

    恕我直言,更好的方法是从头开始在 F# 中思考(例如函数管道、currying、组合器)而不是包装 fluent nhibernate,但是使用 fluent nhibernate已用于生成映射。也就是构建一个F#专用的“并行流利的nhibernate”。

    我已经recently posted 询问了 Windsor 在 F# 中的流畅界面的类似问题。我的结论是,许多为 C#/VB.NET 构建的 DSL/流式接口会在 F# 中中断,所以我认为最好构建适合 F# 方式的特定流式接口。

    【讨论】:

    • 是的......但这是很多工作;)。我会玩的想法,谢谢!
    • 我知道...但是您会在 F# 中使用 NUnitEx (code.google.com/p/nunitex),还是尝试构建类似 FsUnit (code.google.com/p/fsunit) 的东西?
    • DSLs / fluent 接口在跨语言之间的移植性不是很好......例如,我从没想过能够在 C# 中运行 Boo DSL,即使它运行在同一个平台上......所以这和 F# 是一样的
    • 嗯,也许在某些情况下它更明显。但是 FNhibernate 工作正常,除了 |> 忽略,我不知道它会如何消失。
    • 同意,它有效。但是它失去了一些流畅性...关于|>忽略,您可以通过反转每个映射的顺序来避免它,即(伪代码) |>映射(/伪代码)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多