2011-04-24 7 views
0

저는 현재 F #의 Entity Framework Code First Wrapper에서 작업하고 있으며 모든 모듈을 하나의 모듈로 병합해야하는지 궁금해했습니다.F # - 모듈을 병합 하시겠습니까?

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 

사용자에 대한 혼란 많은 모듈을 사용하는 것입니다 : 같은 코드가 전화하라고 요구

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 @> 
     |> EF.withRequiredProperty <@ fun z -> z.Author @> 
      |> EF.hasForeignKey <@ fun z -> z.AuthorId @> 
       |> EF.willCascadeOnDelete true 
    |> finished 

답변

7

이 까다로운 설계 질문입니다.

일반적 F # 1 라이브러리는 동일한 유형 (예를 들어 List.xyzSeq.xyz)와 같은 이름을 가진 별도의 모듈의 유형 (예 : list<T> 또는 seq<T>) 작업 그룹 기능 경향이있다. 사용자가 함수를 찾는 방법을 배우기 때문에 일반적인 유형에 적합합니다.

그러나 일반적으로 자주 사용하지 않는 유형 (예 : 사용자 라이브러리)에서는 이러한 모듈을 찾기가 약간 어려울 수 있습니다 (특히 형식이 명시 적으로 만들어지지 않았지만 (일부 호출의 결과로 얻은 경우). 모듈 이름 다음 꽤 강력 탐험 .를 사용 아마 중첩 된 모듈을 사용하는 것이 좋습니다 것

같은 뭔가 :...

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 
관련 문제