Question

Je suis déconcerté avec NHibernate et mon modèle de domaine en ce moment. Je me fais une belle API dans ma tête mais je vais avoir beaucoup de mal à en faire une réalité. Voici un exemple de ce que je suis en train d'accomplir:

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

Il en va de ce genre de choses dans la boucle Foreach faire une petite couche de sens? : P Je sens que je suis en train de créer une sorte d'interface fluide avec mes classes. J'utilise NHibernate pour la persistance est donc quelque chose comme cela possible ou dois-je juste besoin de faire des choses beaucoup plus simple?

Était-ce utile?

La solution

En supposant que Trip est un IQueryable, une interface fluide pourrait être écrit assez facilement avec les requêtes LINQ et des méthodes d'extension. NOTE: Le code hypothétique suivant n'a pas été testé.

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. Notez l'utilisation du mot clé « this » dans la liste des paramètres de chaque méthode. Cela permet à la méthode à appeler par parsèment toute source IQueryable, comme dans:

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

NOTE: Je ne crois pas qu'il y ait un moyen d'éliminer les parenthèses en utilisant cette technique. Pour ce faire vous devez utiliser les propriétés et C # ne supporte pas les « Propriétés d'extension », seulement « Méthodes d'extension ».

Plus d'infos ici: http://en.wikipedia.org/wiki/Fluent_interface

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top