Pregunta

Wikipedia establece que el patrón de especificación es donde la lógica de negocio se puede recombinar por el encadenamiento de la lógica de negocio juntos usando la lógica booleana. Con respecto a la selección de objetos de filtrado de listas o colecciones me parece que la dinámica de LINQ me permite obtener el mismo resultado. ¿Me estoy perdiendo de algo? ¿Hay otros beneficios para el modelo de especificación que debe ser considerado así?


Editar:

He encontrado algunos mensajes que hablan de la combinación de LINQ y el patrón Especificación:

LINQ Especificaciones Proyecto

Aplicación del Modelo Especificación través Linq por Nicloas Blumhardt (Autofac tio)

¿Alguien ha hecho gone este camino y llegó a ser complicado de mantener?

¿Fue útil?

Solución

Dynamic LINQ utiliza expresiones de cadena para permitir la construcción de consulta dinámica. Así que, de hecho, pierde la seguridad de tipos allí. Mientras que el uso de patrones de envoltura como el patrón decorador de la misma encarnación estrechamente relacionado, el patrón de especificación, que nos permite mantener la seguridad de tipos en el código. Exploro utilizando el patrón de decorador como envoltura de consulta con el fin de reutilizar y dinámicamente construir consultas. Puede encontrar el artículo en el proyecto de código en: de consulta LINQ envolturas

O puede comprobar mi el blog .

Otros consejos

Soy un C # revelador y me gusta utilizar el patrón de especificación, porque está más cerca de mi dominio del negocio. Por otra parte, usted no tiene ninguna sorpresa con este patrón, si existe una especificación de la clase, que debería funcionar. Con LINQ, su proveedor subyacente tal vez no ha implementado algunas características, y usted no sabrá hasta que el tiempo de ejecución.

Pero definitivamente, la mayor ventaja de la especificación sobre LINQ es estar más cerca del negocio, es un mini DSL. LINQ para mí es un DSL para consulta de colección, no por el dominio del negocio.

No sé LINQ realmente, pero me parece que un sistema de consulta declarativa, en general, está relacionada con el modelo de especificación. En particular, la aplicación de un sistema de consulta declarativa mediante la composición de objetos juntos en un entorno orientado a objetos. IIRC que es similar a lo que hace LINQ, proporcionando una capa de azúcar sintáctica.

Si LINQ obsoletes por completo el patrón, que no lo sé. Tal vez hay casos de esquina que simplemente no se pueden expresar en LINQ?

LINQ:

var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList();

Especificación:

var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
  • La lógica de negocio es encapsuled en la especificación (con un nombre que revelan lo que es).
  • SECO : no repetir que LINQ sobre el código, sólo utilizar la especificación

Me gusta usar la especificación cuando pienso que la regla es lo suficientemente importante como para ser explícita en el código y que no pertenece naturalmente a la entidad .

Ejemplo:

public class Customer
{
    //...

    public bool IsAbleToReceiveCredit(decimal creditValue)
    {
        var secureAge = this.Age > 18 && this.Age < 60;
        var personalAssetsGreaterThanCreditValue = this.PersonalAssets.Sum(x => x.Value) > creditValue;

        return secureAge && personalAssetsGreaterThanCreditValue;
    }
}

¿Es de la Customer la responsabilidad para decidir si él es capaz de recibir algo de crédito? Un banco pediría al cliente si puede recibir un préstamo?

Probablemente no.

Así que con la especificación puede quitar que la lógica de la Customer (nunca perteneció a ella). Puede crear algo así como IsAbleToReceiveCreditSpecification y poner toda lógica allí. Podemos ir más allá y combinar especificaciones, por ejemplo:. Podría crear un SecureAgeSpecification y una AssetsGreaterThanSpecification y utilizarlos para componer la IsAbleToReceiveCreditSpecification

Así que no creo que LINQ sustituye a la Especificación. De hecho, se mejora el patrón. Hay algunas implementaciones de la especificación que utilizan LINQ internamente con IQueriable<T>, con ello se puede utilizar la especificación dentro de sus consultas ORM en el nivel del repositorio / DataAcess.

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