2009-06-07 71 views
0

我很迷戀NHibernate和我的領域模型。我在想象一個不錯的API,但我真的很難把它變成現實。下面是我想要實現的一個示例:NHibernate遍歷問題 - 創建一個流暢的界面

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進行持久化,所以是這樣的可能或者我只需要使事情變得更簡單?

+0

請發表您的模型,我們可以看到 – 2009-06-08 00:16:00

回答

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

+0

非常感謝你們的關係!這正是我所尋找的,但不知道該怎麼稱呼它。擴展!謝謝 – CalebHC 2009-06-08 03:31:41