Pregunta

Estoy confundido con NHibernate y mi modelo de dominio en este momento. Me estoy imaginando un buen API en mi cabeza pero estoy teniendo un momento muy difícil por lo que es una realidad. He aquí un ejemplo de lo que estoy tratando de lograr:

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

Lo mismo sucede con esas cosas en el bucle Foreach hacer cualquier pizca de sentido? : P Me siento como si estuviera tratando de crear algún tipo de interfaz fluida con mis clases. Estoy usando NHibernate para la persistencia de modo es algo como esto sea posible o tengo sólo hay que hacer las cosas mucho más simple?

¿Fue útil?

Solución

Si se asume que es un viaje IQueryable, una interfaz fluida se podría escribir con bastante facilidad con consultas LINQ y métodos de extensión. NOTA: La siguiente código hipotético no se ha probado.

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 el uso de la palabra "this" en la lista de parámetros de cada método. Esto permite que el método para ser llamado por salpican cualquier fuente IQueryable, como en:

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

NOTA: No creo que hay una manera de eliminar los paréntesis, utilizando esta técnica. Para ello tendría que utilizar las propiedades, y C # no soporta "Propiedades de extensión", sólo "Métodos de extensión."

Más información aquí: http://en.wikipedia.org/wiki/Fluent_interface

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top