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