0

私は今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ループのそのようなものは意味をなすのですか?:PIは、クラスとのある種の流暢なインターフェイスを作成しようとしているように感じます。私は永続性のためにNHibernateを使用しているので、このようなことは可能ですか、それとももっと単純にする必要がありますか?

4

1 に答える 1

2

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

于 2009-06-08T00:51:46.940 に答える