2009-06-07 8 views
0

Ich bin gerade mit NHibernate und meinem Domain-Modell ratlos. Ich stelle mir eine nette API in meinem Kopf vor, aber es fällt mir wirklich schwer, sie Wirklichkeit werden zu lassen. Hier ist ein Beispiel dafür, was ich zu erreichen bin versucht:NHibernate Traversal Frage - Erstellen einer fließenden Schnittstelle

Trip trip = new Trip("Austria2009"); 

foreach(User user in trip.People.Crew.IsApproved()) 
{ 
    reponse.write(user.Firstname); 
} 

// Or I could hack some of the stuff off above and make it look like this 
foreach(User user in trip.People.Crew) 
{ 
    reponse.write(user.Firstname); 
} 

// Or yet again pull all the people back and forget a specific role 
foreach(User user in trip.People) 
{ 
    reponse.write(user.Firstname); 
} 

So hat das Zeug in der foreach-Schleife jeden lecken Sinn machen? : P Ich habe das Gefühl, dass ich versuche, eine fließende Schnittstelle zu meinem Unterricht zu schaffen. Ich verwende NHibernate für die Persistenz, also ist so etwas möglich oder muss ich einfach die Dinge viel einfacher machen?

+0

Bitte senden Sie Ihr Modell so können wir die Beziehungen sehen –

Antwort

2

Unter der Annahme, dass Trip ein IQueryable ist, könnte eine fließende Schnittstelle relativ einfach mit Linq Queries und Extension-Methoden geschrieben werden. Hinweis: der folgende hypothetische Code wird nicht getestet.

public static class MyExtensions 
{ 
    public static IQueryable<Person> People(this IQueryable<Person> source) 
    { 
     return from person in source 
       select person; 
    } 

    public static IQueryable<Person> Crew(this IQueryable<Person> source) 
    { 
     return from person in source 
       where person.type == crewMember 
       select person; 
    } 
    public static IQueryable<Person> IsApproved(this IQueryable<Person> source) 
    { 
     return from person in source 
       where person.IsApproved == true 
       select person; 
    } 
} 

..etc. Beachten Sie die Verwendung des Schlüsselworts "this" in der Parameterliste jeder Methode. Dies ermöglicht das Verfahren durch Punktierung jede IQueryable Quelle genannt zu werden, wie in:

var crew = myPersons.Crew(); 
var approvedCrew = myPersons.Crew().IsApproved(); 

HINWEIS: Ich glaube nicht, dass es einen Weg gibt, die Klammern mit dieser Technik zu beseitigen. Dazu müssten Sie Eigenschaften verwenden, und C# unterstützt nicht "Extension Properties", nur "Extension Methods".

Mehr Infos hier: http://en.wikipedia.org/wiki/Fluent_interface

+0

Vielen Dank! Das war genau das, wonach ich suchte, wusste aber nicht, wie ich es nennen sollte. Erweiterungen! Vielen Dank – CalebHC