nhibernate traversal 질문 - 유창한 인터페이스 생성
-
12-09-2019 - |
문제
나는 지금 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를 사용하고 있으므로 이와 같은 것이 가능합니까, 아니면 물건을 훨씬 더 간단하게 만들어야합니까?
해결책
트립이 퀴즈가 가능하다고 가정하면 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;
}
}
..등. 각 메소드의 매개 변수 목록에 "이"키워드를 사용하십시오. 이를 통해 다음과 같이 IQueryable 소스를 점령하여 메소드를 호출 할 수 있습니다.
var crew = myPersons.Crew();
var approvedCrew = myPersons.Crew().IsApproved();
참고 :이 기술을 사용하여 괄호를 제거하는 방법이 없다고 생각합니다. 이를 위해서는 속성을 사용해야하며 C#은 "확장 속성"을 지원하지 않으며 "확장 방법"만 지원하지 않습니다.
추가 정보는 여기에 있습니다 : http://en.wikipedia.org/wiki/fluent_interface
제휴하지 않습니다 StackOverflow