Combinando código C # e código de banco de dados em uma Especificação
s vezes, você precisa definir algumas regras de negócios e o padrão de especificação é uma ferramenta útil. Por exemplo
public class CanBorrowBooksSpec : ISpecification<Customer>
{
public bool Satisfies(Customer customer)
{
return customer.HasLibraryCard
&& !customer.UnpaidFines.Any();
}
}
o entanto, muitas vezes acho que preciso "inserir" essas regras no SQL para melhorar o desempenho ou atender a coisas como listas de registros paginada
Em seguida, tenho que escrever o código para as regras duas vezes, uma vez no código CLR e uma vez na SQL (ou linguagem ORM
Como você organiza códigos como este?
Parece melhor se o código foi mantido junto na mesma classe. Dessa forma, se o desenvolvedor estiver atualizando as regras de negócios, ele terá menos chance de esquecer de atualizar os dois conjuntos de códigos. Por exemplo
public class CanBorrowBooksSpec : ISpecification<Customer>
{
public bool Satisfies(Customer customer)
{
return customer.HasLibraryCard
&& !customer.UnpaidFines.Any();
}
public void AddSql(StringBuilder sql)
{
sql.Append(@"customer.HasLibraryCard
AND NOT EXISTS (SELECT Id FROM CustomerUnpaidFines WHERE CustomerId = customer.Id)");
}
}
No entanto, isso me parece bastante feio, pois agora estamos misturando preocupaçõe
Outra alternativa seria usar uma solução Linq-To-YourORM, pois o código LINQ poderia ser executado em uma coleção ou traduzido para SQL. Mas descobri que essas soluções raramente são possíveis em nada além dos cenários mais triviai
O que você faz