聚会有点晚了,但我想添加另一个用法。
我倾向于使用[<AutoOpen>] 在命名空间中公开类型。
// SlimSql\Types.fs
namespace SlimSql
[<AutoOpen>]
module Types =
type SqlOperation =
{
Statement : string
Parameters : SqlParam list
}
然后我可以将函数附加到相同的类型名称,而不会出现该名称已在使用中的编译器错误。
// SlimSql\SqlOperation.fs
namespace SlimSql
module SqlOperation =
let merge (operations : SqlOperation list) : SqlOperation =
...
let wrapInTransaction operation =
...
然后,在消费代码中,所有内容都以相同的名称很好地打包。因此,当用户在 SqlOperation 数据上查找行为时,他们自然可以通过键入 SqlOperation. 找到它,Intellisense 会显示出来。与List 等类型在实践中的使用方式非常相似。
open SlimSql
let operations =
[
sql "INSERT INTO ...." [ p "@Value" 123; ... ]
...
]
let writeOp =
operations
|> SqlOperation.merge
|> SqlOperation.wrapInTransaction
SlimSql.Types 模块也可以自己打开,只访问与其他类型组合的类型。
比起使用静态成员扩充类型,我更喜欢这种解决方案。