NHibernate Traversal Question - Création d'une interface Fluent
-
12-09-2019 - |
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?
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