2009-04-07 6 views
2

私は、F#(つまり引用のサポート)でうまく使えるようにFluent NHibernateを拡張していますが、APIのde-fluentingに関するフィードバックがほしいです。 F#では、型の単位でない限り、戻り値を使用する必要があります。だから、これはとのすべての行を終端終わる「|>無視」:F#:APIを流動的にする最も良い方法は?

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 

あなたはどう思いますか?

答えて

3

IMHOより良いアプローチではなく、流暢NHibernateのは、マッピングを生成するために使用しているものを使用して、流暢NHibernateは、しかしを包むのF#(例えば機能配管、カリー化、コンビネータ)で考えるゼロからスタートすることです。つまり、F#専用の "並列流暢なnhibernate"を構築することです。

私はrecently postedに、F#のWindsorの流暢なインターフェイスに関する同様の問題について書かれています。私の結論は、C#/ VB.NETのために構築された多くのDSL /流暢なインターフェイスはF#で中断されるため、F#に適した特定の流暢なインターフェイスを構築することが最善だと思います。

+0

そうですが...それはたくさんの仕事です;)。アイデアと一緒に遊ぶよ、ありがとう! – MichaelGG

+1

私は知っていますが、F#でNUnitEx(http://code.google.com/p/nunitex/)を使用するか、FsUnit(http://code.google.com/ p/fsunit /)? –

+0

DSL /流暢なインターフェースは言語間で移植性があまりよくありません...例えば、同じプラットフォームで実行されていてもBoo DSLをC#で実行できるとは思えませんでした。だからF# –

関連する問題