Usuário com melhor resposta
Dúvida na facade

Pergunta
-
Bom dia,
Estou desenvolvendo uma aplicação em C# onde a arquitetura adotada é a seguinte:
BO --> FACADE --> dalc
BUSINESS ENTITY para comunicação entre as camadas:
DUVIDA: Atualmente uma das utilidades da minha camada FACADE é controlar transações, portanto gostaria de saber SE É ERRADO um método facade chamar 2 ou 3 métodos dalc
Exemplo:
Facade.AtualizaEstoque()
{
INICIA TRANSACAO
Dalc.AlterarEstoque
Dalc.AtualizarMovimentoEstoque
COMMITA OU ROLBACK
}
Respostas
-
Tudo depende.
Arquitetura tem que ser desenvolvida para resolver um problema, e não para tentar achar um para justificá-la.
Muitas pessoas criam arquiteturas com um padrão por estar na moda, ou por estar nos sites dizendo que é certo.
Se para seu caso esta arquitetura atende os requisitos, está certo!
Abraços.
Todas as Respostas
-
Alexandre,
na minha opinião a comunicação entre as camadas está errada.
Em um ambiente de serviços, as regras de negócio tendem a sofrer alterações até que se estabilizem. Contando com esta instabilidade, é necessário fornecer aos clientes destas regras um ponto único de entrada, uma interface comum para as funcionalidade / regras de negócio, para que alterações nesta camada não gerem alterações nas aplicações clientes que as utilizam (Baixo acoplamento - estabilidade dos assemblies relacionados).
Considerando que na sua arquitetura a camada BO armazena as regras de negócio, a camada Façade teria que representar este ponto de entrada para a regra de negócio, expondo métodos com base em serviços, agrupando então as chamadas para as regras de negócio relacionadas.
Façade > Business Objects > Dalc.
O controle de transação, quando feito via aplicação, teria que ser feito na camada Façade, para que um conjunto de regras de negócios relacionadas tenham um mesmo comportamento transacional.
Outro ponto interessante é manter os métodos das BOs o mais atômico possível. Cada método deve efetuar apenas uma tarefa bem definida. No seu exemplo, um método AtualizarEstoque da camada de negócio estaria executando a alteração de estoque a a atualização de movimento no estoque. Adaptando para o modelo que sugiro, a classe da regra de negócio implementaria um método exclusivo para cada função, se comunicando com a DALC e façade invocando os métodos. Neste modelo, conseguiriamos manter as classes sem alterações mas passíveis de extensão, uma vez que um método, quando implementado na regra de negócio, não sofreria alterações, já que sua função é única e bem definida.
Espero ter ajudado com alguma coisa.
Abraços.
-
Ok, com relação ao exemplo foi somente para tentar explicar o meu problema.
Com relação a arquitetura FACADE -> BO -> DALC eu andei lendo alguns artigos onde dizia que não era errado utilizar BO --> FACADE --> DALC e por esse motivo adotei essa ordem.
-
Tudo depende.
Arquitetura tem que ser desenvolvida para resolver um problema, e não para tentar achar um para justificá-la.
Muitas pessoas criam arquiteturas com um padrão por estar na moda, ou por estar nos sites dizendo que é certo.
Se para seu caso esta arquitetura atende os requisitos, está certo!
Abraços.
-
-
-
Voce pode deixar o seu FACADE chamando N metodos DAL
Eu particulamente deixaria as transacoes para a camada DAL onde teria um cenario mais ou menos assim;
=======================
Assemblie FACADE Estoque
{
AtualizarEstoque()
AvisarFornecedor()
}
===================
Assemblie DAL Estoque
AtualizarEstoque()
{
INICIA TRANSACAO
Dalc.AlterarEstoque
Dalc.AtualizarMovimentoEstoque
COMMITA OU ROLBACK
}
=======================
Assemblie DAL Fornecedor
AvisarFornecedor()
{
INICIA TRANSACAO
Dalc.AlterarEstoque
Dalc.AtualizarMovimentoEstoque
COMMITA OU ROLBACK
}
Nao esta errado o que voce esta falando , so deixaria as transacoes para o DAL Ok
-
Voce pode deixar o seu FACADE chamando N metodos DAL
Eu particulamente deixaria as transacoes para a camada DAL onde teria um cenario mais ou menos assim;
=======================
Assemblie FACADE Estoque
{
AtualizarEstoque()
AvisarFornecedor()
}
===================
Assemblie DAL Estoque
AtualizarEstoque()
{
INICIA TRANSACAO
Dalc.AlterarEstoque
Dalc.AtualizarMovimentoEstoque
COMMITA OU ROLBACK
}
=======================
Assemblie DAL Fornecedor
AvisarFornecedor()
{
INICIA TRANSACAO
Dalc.AlterarEstoque
Dalc.AtualizarMovimentoEstoque
COMMITA OU ROLBACK
}
Nao esta errado o que voce esta falando , so deixaria as transacoes para o DAL Ok
descordo um pouco, a transação deve ser controla um nivel a cima
inicia a transação
AtualizarEstoque()
AvisarFornecedor()
commit ou rollback
assim se qualquer uma das operações der erro, o rollback é em tudo.
-