Sempre há um debate sobre o tópico - "Se a lógica de negócios deve ser inserida em Procedimento armazenado ou não?". Se decidirmos não usar a ferramenta ORM e não colocar a lógica de negócios no procedimento armazenado, onde colocaremos a lógica de negócios?
Nos meus aplicativos anteriores, sempre preferi colocar toda a lógica de negócios apenas em procedimentos armazenados. Em seguida, no código .NET, chamo esses procedimentos armazenados usando os blocos de aplicativos de acesso a dados. SQLHelper etc. Mas esse não pode ser o cenário o tempo todo. Então eu pesquisei no Google, mas acabei confuso .......
Alguma sugestão ...?
Respostas:
Eu adotaria uma abordagem pragmática - historicamente, o principal 'benefício' de manter a lógica de negócios em procs armazenados é por razões de desempenho (arquitetura de 2,5 camadas), enquanto separar a lógica de negócios em uma camada de BLL (camada 3 / N) geralmente é mais limpa de uma perspectiva de manutenção e mais fácil de testar (simule / desconecte o acesso a dados).
No entanto, como os ORMS .NET habilitados para LINQ, como LINQ2SQL, EF e NHibernate, agora criam consultas SQL parametrizadas, nas quais os planos de consulta podem ser armazenados em cache, são escapados para a Injeção SQL, etc. mais convincente do que nunca, e a maioria dos SPROCs (especialmente os centrados em consultas) podem ser totalmente evitados. Os padrões de repositório no .NET normalmente expõem os parâmetros da árvore IQueryable / accept Expression, permitindo um tipo de acesso seguro e flexível às suas tabelas. (Pessoalmente, nas arquiteturas do tipo SOA, eu não exporia o IQueryable além da BLL, ou seja, suas camadas de Serviço e Apresentação devem funcionar com um conjunto de métodos bem definido. O motivo é que, caso contrário, você nunca poderá testar completamente o seu sistema e você ganhará '
No entanto, em um sistema de tamanho decente, sempre haverá algumas exceções, nas quais um código realmente intensivo em dados ainda precisa ser gravado como um Proc armazenado por motivos de desempenho. Nesses casos, eu manteria o SPROC e o exporia através do ORM, mas ainda assim exporia a função como um método de passagem na sua BLL.
fonte
Sendo um desenvolvedor java, minha preferência era colocar a lógica de negócios no BLL (controle de fonte fácil e agradável, familiaridade etc etc etc).
No entanto, depois de trabalhar para uma grande empresa com muitos aplicativos distribuídos usando diferentes tecnologias (C #, Java, Pick (não pergunte)), um benefício significativo do uso de procedimentos armazenados tornou-se aparente:
Os procedimentos armazenados podem ser compartilhados entre diferentes aplicativos .
fonte
Nossa equipe tem uma regra simples aqui. Às vezes, é melhor resolver a lógica de negócios em T-SQL; às vezes, é mais fácil fazê-lo em c # (camada de negócios).
Portanto, temos uma solução pragmática: coloque onde se encaixa melhor. Eu sei que a teoria às vezes é muito rigorosa sobre isso ... mas isso é teoria :-)
fonte
Existem vantagens e desvantagens de ambos (na minha opinião):
Os procedimentos armazenados podem se tornar um pesadelo se você não estiver usando algum tipo de controle de origem SQL (o que muitos lugares não fazem) e você tiver vários desenvolvedores trabalhando neles. Alguém pode alterar um procedimento armazenado e esquecer de atualizar o código que chama esse procedimento e, antes que você perceba, você acabou de criar e implantar um site que lançará exceções sem tratamento (incompatibilidade de contagem de parâmetros, etc.).
Por outro lado, os procedimentos armazenados permitem correções de erros mais rápidas em determinadas situações. Se houver um erro com um procedimento armazenado, você apenas o corrige e pronto. Uma correção de bug em um ORM requer uma reconstrução. Dependendo do seu processo de compilação, isso pode ser demorado / irritante.
fonte
Sempre colocamos nossa lógica de negócios na camada de lógica de negócios. Se você colocá-lo no Procedimento armazenado, ele será perdido quando você alterar seu RDBMS.
fonte
"Lógica de negócios" é um termo um tanto vago. Quero dizer, não tem uma definição única. Uma regra prática é minimizar a comunicação entre as camadas quando possível. Portanto, você não precisa enviar o nome do cliente em branco ao servidor para verificá-lo antes de inserir uma linha.
Há casos em que uma regra é baseada em uma leitura de banco de dados. Digamos que você queira transferir dinheiro da Conta 1 para a Conta 2. Você precisa ler as duas contas, verificar se estão em bom estado e se o valor da Conta 1 é suficiente. Nesse caso, o servidor é um candidato melhor para esta regra porque o cliente (sendo o BL aqui) não precisa emitir 3 chamadas para a camada de banco de dados para esse processo.
Obviamente, se você precisar que sua solução seja independente do banco de dados, faça procs armazenados apenas para CRUD (se houver algum).
fonte
A lógica deve estar sempre na BLL porque:
Acredito que deveria haver uma lei que afirma que, após um SP ter mais de X linhas, ele não funciona conforme o esperado.
fonte
Criamos uma camada de serviços que contém toda a nossa lógica de negócios implementada no idioma escolhido e usamos apenas o banco de dados para consultas. Essa abordagem é um pouco exigida por nós, porque nosso objetivo é criar soluções COTS para entregar aplicativos com várias implementações de banco de dados. O Hibernate provou ser um salva-vidas para nós nessas circunstâncias.
Penso que a maior vantagem dessa abordagem, além da portabilidade do banco de dados, é que você pode encontrar todas as suas respostas em uma pesquisa.
Além disso, apesar de algumas das respostas de um fórum, tenho um amigo trabalhando para uma companhia de seguros da Fortune 100 que fez duas conversões de banco de dados em três anos porque o banco de dados de escolha para a empresa mudou.
fonte
Na minha experiência limitada, prefiro manter a integridade dos dados com procedimentos armazenados e outros recursos do banco de dados. Por exemplo, se eu estivesse implementando uma transferência de fundos entre duas contas, escreveria um procedimento armazenado. Acho valioso poder usar vários idiomas de aplicativos.
fonte