Вопрос об обходе NHibernate - Создание свободного интерфейса

StackOverflow https://stackoverflow.com/questions/963020

Вопрос

Прямо сейчас я в тупике с 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 какой-либо смысл?:P У меня такое чувство, что я пытаюсь создать какой-то плавный интерфейс с моими классами.Я использую NHibernate для сохранения, так возможно ли что-то подобное или мне просто нужно сделать все НАМНОГО проще?

Это было полезно?

Решение

Предполагая, что 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top