F# - 合并模块?
问题描述:
我现在正在研究F#的Entity Framework Code First Wrapper,我一直在想我是否应该将所有模块合并到一个模块中。F# - 合并模块?
看看这个:
module ManyNavProperty =
let withMany (cfg:ManyNavPropertyInfo<'a,'b>) = cfg.WithMany()
let withSeq expr (cfg:ManyNavPropertyInfo<'a,'b>) = cfg.WithSeq expr
let withList expr (cfg:ManyNavPropertyInfo<'a,'b>) = cfg.WithList expr
let withArray expr (cfg:ManyNavPropertyInfo<'a,'b>) = cfg.WithArray expr
let withOptional (cfg:ManyNavPropertyInfo<'a,'b>) = cfg.WithOptional()
let withOptionalProperty expr (cfg:ManyNavPropertyInfo<'a,'b>) = cfg.WithOptional expr
let withRequired (cfg:ManyNavPropertyInfo<'a,'b>) = cfg.WithRequired()
let withRequiredProperty expr (cfg:ManyNavPropertyInfo<'a,'b>) = cfg.WithRequiredProperty expr
module DependentNavProperty =
let hasForeignKey expr (cfg:DependentNavPropertyInfo<'a>) = cfg.HasForeignKey expr
module CascadableNavProperty =
let willCascadeOnDelete b (cfg:CascadableNavPropertyInfo) = cfg.WillCascadeOnDelete b
module EF =
let entity<'a when 'a : not struct> (cfg:DbModelBuilder) = EntityInfo<'a>(cfg.Entity<'a>())
let hasKey expr (cfg:EntityInfo<'a>) = cfg.HasKey expr
let hasSeq expr (cfg:EntityInfo<'a>) = cfg.HasSeq expr
let hasList expr (cfg:EntityInfo<'a>) = cfg.HasList expr
let hasArray expr (cfg:EntityInfo<'a>) = cfg.HasArray expr
let hasOptional expr (cfg:EntityInfo<'a>) = cfg.HasOptional expr
let hasRequired expr (cfg:EntityInfo<'a>) = cfg.HasRequried expr
let toTable s (cfg:EntityInfo<'a>) = cfg.ToTable s
,要求我打电话给喜欢代码:
override x.OnModelCreating (mb:DbModelBuilder) =
let finished = ignore
let entity = EF.entity<Author> mb
entity
|> EF.hasSeq <@ fun z -> z.Books @>
|> ManyNavProperty.withRequiredProperty <@ fun z -> z.Author @>
|> DependentNavProperty.hasForeignKey <@ fun z -> z.AuthorId @>
|> CascadableNavProperty.willCascadeOnDelete true
|> finished
就是利用这么多的模块,为用户混淆的? - 我是否应该将它们全部放入一个模块中,否则会破坏用户的概述?
,其中所有的功能被放置在同一个模块的一个例子:
override x.OnModelCreating (mb:DbModelBuilder) =
let finished = ignore
let entity = EF.entity<Author> mb
entity
|> EF.hasSeq <@ fun z -> z.Books @>
|> EF.withRequiredProperty <@ fun z -> z.Author @>
|> EF.hasForeignKey <@ fun z -> z.AuthorId @>
|> EF.willCascadeOnDelete true
|> finished
答
这是一个棘手的问题设计。
通常,F#库倾向于与在名为一个单独的模块类型(例如list<T>
或seq<T>
)工作相同的类型(例如List.xyz
和Seq.xyz
)组的功能。这适用于常见类型,因为用户可以学习如何查找功能。但是,对于较不常见的类型(例如,您自己的库),发现这些模块可能有点困难(特别是如果类型不是显式创建的(但是由于某个调用而获得)模块名称,然后用.
去探索它是相当强大的
我可能会建议使用嵌套的模块是这样的:。
module EF =
// common functions
module Cascadable =
// CascadableNavProperty functions
module Many =
// etc.
的用户可以再找个用EF
开始一切,他们会写例如:
entity
|> EF.hasSeq <@ fun z -> z.Books @>
|> EF.Many.withRequiredProperty <@ fun z -> z.Author @>
|> EF.Dependent.hasForeignKey <@ fun z -> z.AuthorId @>
|> EF.Cascadable.willCascadeOnDelete true
|> finished