Вопрос про NHibernate - создание свободного интерфейса - PullRequest
0 голосов
/ 08 июня 2009

Я сейчас в тупик с 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 для настойчивости, так что-то вроде этого возможно, или мне просто нужно сделать вещи намного проще?

1 Ответ

2 голосов
/ 08 июня 2009

Если предположить, что 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

...