Вопрос про NHibernate - создание свободного интерфейса
Я зашла в тупик с NHibernate и моей доменной моделью прямо сейчас. Я представляю себе хороший API в своей голове, но мне очень трудно воплотить его в жизнь. Вот пример того, что я пытаюсь сделать:
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);
}
Значит ли это, что в цикле Foreach есть смысл? Я чувствую, что я пытаюсь создать какой-то свободный интерфейс со своими классами. Я использую NHibernate для настойчивости, так что-то вроде этого возможно, или мне просто нужно сделать вещи намного проще?
1 ответ
Предполагая, что Trip является IQueryable, свободный интерфейс можно было бы написать довольно легко с помощью запросов Linq и методов расширения. ПРИМЕЧАНИЕ. Следующий гипотетический код не проверен.
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;
}
}
..так далее. Обратите внимание на использование ключевого слова this в списке параметров каждого метода. Это позволяет вызывать метод, ставя точки на любом источнике IQueryable, как в:
var crew = myPersons.Crew();
var approvedCrew = myPersons.Crew().IsApproved();
ПРИМЕЧАНИЕ: я не верю, что есть способ устранить скобки, используя эту технику. Для этого вам нужно будет использовать свойства, а C# не поддерживает "Свойства расширения", только "Методы расширения".
Более подробная информация здесь: http://en.wikipedia.org/wiki/Fluent_interface