Pergunta

Wikipedia afirma que o padrão de especificação é onde a lógica de negócios pode ser recombinados encadeando a lógica de negócios juntos usando a lógica booleana. Com relação à seleção de objetos de filtragem de listas ou coleções parece-me que Dinâmico LINQ permite-me fazer a mesma coisa. Estou esquecendo de algo? Existem outros benefícios para o Padrão Especificação que deve ser considerado bem?


Editar:

Eu encontrei alguns posts que discutem combinando LINQ eo Padrão Especificação:

Linq Especificações Projeto

implementar o padrão Especificação via Linq por Nicloas Blumhardt (Autofac cara)

Alguém ido feito esta estrada e fê-lo tornar-se complicado para manter?

Foi útil?

Solução

Dinâmico LINQ usa expressões de cadeia para permitir a construção de consulta dinâmica. Então o que fazemos de fato perder a segurança de tipos lá. Considerando o uso de padrões de mensagens publicitárias como o padrão decorador dele encarnação intimamente relacionados, o padrão de especificação, nos permite manter a segurança de tipos em código. Eu explorar usando o padrão Decorator como invólucro de consulta, a fim de reutilização e criar dinamicamente consultas. Você pode encontrar o artigo no projeto de código em: Linq consulta envoltórios

Ou você pode verificar o meu blogue .

Outras dicas

Eu sou um C # developper e como usar o padrão de especificação, porque é mais perto do meu domínio do negócio. Além disso, você não tem nenhuma surpresa com esse padrão, se existe uma classe especificação, ele deve funcionar. Com Linq, o seu provedor subjacente talvez não implementou algumas características, e você não vai saber que até a execução.

Mas definitivamente, a maior vantagem de especificação sobre linq é estar mais perto do negócio, é um mini DSL. LINQ para mim é uma DSL para consulta de coleta, não para o domínio do negócio.

Eu não sei LINQ realmente, mas parece-me que um sistema de consulta declarativa, em geral, está relacionada com o padrão de especificação. Em particular, a implementação de um sistema de consulta declarativa compondo objetos juntos em um ambiente orientado a objeto. IIRC que é semelhante ao que LINQ faz, proporcionando uma camada de açúcar sintático.

Se LINQ obsoletes completamente o padrão, eu não posso dizer. Talvez existam casos de canto que simplesmente não podem ser expressos em LINQ?

LINQ:

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

Especificação:

var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
  • A lógica do negócio é encapsulado na especificação (com um nome que revelam o que é).
  • DRY : você não repetir que linq sobre o código, você só utilizar a especificação

Eu gosto de especificação de utilização quando penso que a regra é bastante importante estar explícita no código e não pertence naturalmente para a entidade .

Exemplo:

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

É do Customer o responsabilidade para decidir se ele é capaz de receber algum crédito? Um banco iria pedir ao cliente se ele pode receber um empréstimo?

Provavelmente não.

Assim, com especificação você pode remover essa lógica do Customer (ele nunca pertenceu a ele). Você pode criar algo como IsAbleToReceiveCreditSpecification e colocar toda a lógica lá. Podemos ir mais longe e combinar especificações, por exemplo:. Você poderia criar um SecureAgeSpecification e uma AssetsGreaterThanSpecification e usá-los para compor o IsAbleToReceiveCreditSpecification

Então, eu não acho que LINQ substitui a especificação. Na verdade, melhora o padrão. Existem algumas implementações de Especificação que o uso LINQ internamente com IQueriable<T>, com isso, você pode usar a especificação dentro de suas consultas ORM no nível Repository / DataAcess.

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