2009-04-07 12 views
2

Je suis en train d'étendre NHibernate Fluent pour une meilleure utilisation avec F # (à savoir, le support de devis), et je veux des commentaires sur la fluidité de l'API. F # exige que les valeurs de retour soient utilisées, sauf si elles sont de type unit. Donc, cela finit par mettre fin à chaque ligne avec « |> ignorer »:F #: Meilleure façon de démultiplier une 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 

Ma première réaction a été d'ajouter d'autres méthodes à la classe de base afin qu'ils reviennent l'unité. Par exemple, « dI » et « Mapi »:

... 
m.IdI <@ x.Id @> 
m.MapI <@ x.Name @> 
m.MapI <@ x.Price @> 
... 

Mais cela nécessite spécifiques ici et surcharges là, et de longues chaînes vont encore avoir besoin d'une |> Ignorer. J'ai également considéré l'extension d'objet avec une propriété Terminé:

(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 

Qu'en pensez-vous?

Répondre

3

à mon humble avis une meilleure approche serait de commencer à partir de zéro penser en F # (tuyauterie de fonction par exemple, taitement, combinateurs) au lieu d'emballage Fluent NHibernate, mais en utilisant ce NHibernate Fluent a utilisé pour générer les correspondances. C'est-à-dire, la construction d'un "nhibernate fluent parallèle" pour l'usage exclusif de F #.

J'ai un recently posted à propos d'un problème similaire avec l'interface fluide de Windsor en F #. Ma conclusion est que de nombreuses interfaces DSL/fluides construites pour C#/VB.NET vont casser en F # donc je pense qu'il est préférable de construire des interfaces fluides spécifiques qui conviennent à la manière F #.

+0

Oui ... mais c'est beaucoup de travail;). Je vais jouer avec idée, merci! – MichaelGG

+1

Je sais ... mais utiliseriez-vous NUnitEx (http://code.google.com/p/nunitex/) en F #, ou essaieriez-vous de construire quelque chose comme FsUnit (http://code.google.com/ p/fsunit /)? –

+0

DSLs/interfaces fluides ne sont tout simplement pas très portable entre les langues ... par exemple, je ne m'attendrais jamais à être en mesure d'exécuter un Boo DSL en C# même si elle fonctionne sur la même plate-forme ... donc c'est la même chose avec F # –