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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top