Domanda

Sono sconcertato con NHibernate e il mio modello di dominio in questo momento. Sto immaginando una bella API nella mia testa, ma sto avendo un momento davvero difficile che lo rende una realtà. Ecco un esempio di quello che sto cercando di realizzare:

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);
}

Così fa quella roba nel ciclo foreach effettuare qualsiasi mano di senso? : P Mi sento come sto cercando di creare una sorta di interfaccia fluida con le mie classi. Sto usando NHibernate per la persistenza così è qualcosa di simile possibile o ho solo bisogno di rendere le cose molto più semplice?

È stato utile?

Soluzione

Supponendo che Trip è un IQueryable, un'interfaccia fluida potrebbe essere scritta abbastanza facilmente con le query LINQ e metodi di estensione. NOTA: Il seguente codice di ipotetica non è testato.

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;
    }
}

.. ecc. Si noti l'uso del "questo" parola chiave nella lista dei parametri di ciascun metodo. Questo permette il metodo da richiamare da punteggiatura qualsiasi fonte IQueryable, come in:

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

NOTA: Non credo ci sia un modo per eliminare le parentesi con questa tecnica. Per fare questo si avrebbe bisogno di utilizzare le proprietà, e C # non supporta "Proprietà Extension", solo "Metodi di estensione".

Più informazioni su: http://en.wikipedia.org/wiki/Fluent_interface

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top