Pergunta

Estou perplexo com NHibernate e meu modelo de domínio no momento. Eu estou imaginando uma boa API na minha cabeça, mas eu estou tendo um momento realmente difícil torná-la realidade. Aqui está um exemplo do que estou tentando realizar:

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);
}

O mesmo acontece com essas coisas no loop Foreach fazer qualquer pingo de sentido? : P Eu sinto que eu estou tentando criar algum tipo de interface fluente com minhas aulas. Eu estou usando NHibernate para persistência assim é algo como isto possível ou eu só preciso tornar as coisas muito mais simples?

Foi útil?

Solução

Assumindo que viagem é um IQueryable, uma interface fluente poderia ser escrito com bastante facilidade com consultas LINQ e os métodos de extensão. NOTA: O código hipotética seguinte não é testado.

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;
    }
}

.. etc. Observe o uso do "presente" palavra-chave na lista de parâmetros de cada método. Isso permite que o método a ser chamado por pontilhando qualquer fonte IQueryable, como em:

var crew = myPersons.Crew();
var approvedCrew = myPersons.Crew().IsApproved();

NOTA: Eu não acredito que há uma maneira de eliminar os parênteses usando esta técnica. Para fazer isso você precisaria usar propriedades, e não C # não suporta "Propriedades extensão", apenas "Métodos de extensão."

Mais informações aqui: http://en.wikipedia.org/wiki/Fluent_interface

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top