YoProgramo.NET Blog
Anotaciones de Programador

Manejo de Especificaciones con el delegado Func

Al leer el post de Darío llamado “Predicados y Especificaciones” y luego de hablar ayer con José quise implementar lo que Darío escribió en ese post usando lo que me enseño José. La idea es utilizar el delegado Func<T, bool> en vez de un delegado común.

En el código fuente de yoprogramo.net existen muchas partes donde necesito especificar cosas, ya sea para consultas, etc. Para esto el patrón de especificaciones anda perfecto, les muestro lo que yo hice.

Mi función antes de usar especificaciones:

public IList<IPost> TraerPostsParaHome(int? top)
{
    var query = (from s in TraerTodosSinSpam()
                 where !s.Bloqueado
                 orderby s.PostedAt descending
                 select s).Take(top ?? 100).ToList();
}

Y ahora, luego del refactory quedó así:

public IList<IPost> TraerPostsParaHome(int? top)
{
    return TraerTodosSinSpam()
            .Where(PostEspecificacion.EsApto)
            .OrderByDescending(PostEspecificacion.OrdenarHomePor)
            .Take(top ?? 100)
            .ToList();
}

Mi clase PostEspecificacion:

namespace YoProgramo.Core.Especificaciones
{
    public class PostEspecificacion
    {
        public static Func<IPost, bool> EsApto
        {
            get
            {
                return x => !x.Bloqueado;
            }            
        }

        public static Func<IPost, DateTime> OrdenarHomePor
        {
            get
            {
                return x => x.PostedAt;
            }
        }
    }
}
December 23, 2009 11:35 by fabianfigueredo
Categorías: C#

Add comment


(Will show your Gravatar icon)

biuquote
Loading