문제

나는 지금 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top