NHibernate Traversal Frage - Erstellen einer Fluent Interface
-
12-09-2019 - |
Frage
Ich bin mit NHibernate und meiner Domain Model jetzt ratlos. Ich bin eine schöne API in meinem Kopf vorstellen, aber ich bin eine wirklich harte Zeit, es Realität werden zu lassen. Hier ist ein Beispiel dafür, was ich versuche zu erreichen:
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);
}
hat also das Zeug in der foreach-Schleife jeden lecken Sinn machen? : P Ich fühle mich wie ich versuche, eine Art von Fluent Interface mit meinen Klassen zu erstellen. Ich verwende so NHibernate für Ausdauer ist so etwas wie das möglich oder muss ich nur die Dinge viel einfacher machen?
Lösung
Diese Reise Unter der Annahme ist eine IQueryable, eine fließend Schnittstelle ziemlich leicht mit Linq-Abfragen und Erweiterungsmethoden geschrieben werden kann. HINWEIS: Die folgenden hypothetischen Code nicht getestet wird.
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 „this“ Schlüsselwort in der Parameterliste der einzelnen Methoden. Dies ermöglicht das Verfahren durch Punktierung jeder IQueryable Quelle genannt zu werden, wie in:
var crew = myPersons.Crew();
var approvedCrew = myPersons.Crew().IsApproved();
Hinweis: Ich glaube nicht, dass es eine Möglichkeit ist, die Klammern mit dieser Technik zu beseitigen. Dazu müssen Sie Eigenschaften verwenden müssten, und C # unterstützt keine „Extension Eigenschaften“, nur „Erweiterungsmethoden.“
Weitere Informationen hier: http://en.wikipedia.org/wiki/Fluent_interface