F# - 合并模块?

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.xyzSeq.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