Ao planejar a arquitetura para um aplicativo da Web MVC de médio porte, como você implementa as camadas para serem o mais dissociadas possível e fácil de testar? (basicamente siga as práticas recomendadas) Digamos que eu estou usando o código primeiro como meu acesso a dados.
Eu luto com o que definir "lógica de negócios" como e como ela deve interagir com a camada de dados. Tomando um aplicativo de vendas de veículos como exemplo, a lógica de negócios seria classes que executavam tarefas como calcular a faixa de impostos para determinados veículos, comparar estatísticas de milhas por galão, etc.? Quanto às entidades comerciais (por exemplo, carros, vans, motocicletas), eu as colocaria na camada de dados junto com a minha DataContext
classe.
Além disso, o que constituiria a lógica do aplicativo em oposição aos negócios - estou adivinhando coisas como validações de entrada de sessão / usuário?
Por exemplo, um controlador de carro pode retornar um resultado de ação / exibição que lista os dez melhores carros filtrados por tipo e melhor mpg. Então, digamos que eu tenha um ICarRepository
'carRepo' injetado no meu controlador (usando o padrão de repositório / DI), eu filtrei meus carros a partir de um parâmetro do método de ação, por exemplovar cars = carRepo.getCarsByType("hatchback");
Portanto, mantive o conhecimento de acesso a dados fora do meu controlador usando um repositório, agora para manter a lógica de negócios fora do controlador usando um modelo de domínio - var result = new MpgCalculator (cars); - Digamos que eu precise da classe da calculadora, pois ela precisa executar uma lógica adicional para calcular a melhor eficiência de combustível, mais do que apenas carregar / filtrar entidades do DB. Portanto, agora eu tenho um conjunto de dados para renderizar minha visão que utilizava um repositório para recuperar da camada de acesso a dados e objeto específico do domínio para processar e executar tarefas relacionadas a negócios nesses dados.
Estou cometendo erros aqui? ainda precisamos usar o padrão de repositório ou posso apenas codificar em uma interface para desacoplar o ORM e testar? Neste tópico, como minhas classes concretas de acesso a dados dbcontext estão na camada de dados, as definições de interface devem entrar na camada domínio / negócio, o que significa que, se a tecnologia de acesso a dados for alterada, minhas outras camadas não serão afetadas?
Pelo que estudei até agora, minha estrutura se parece com isso:
MVC Internet Application -> O projeto padrão da Internet - modelos aqui são ViewModels
Camada de domínio / negócios -> classes / modelos específicos de negócios que os controladores podem usar para processar entidades de domínio da camada de dados antes de passar para as visualizações relevantes
Abstração de repositório necessária? -> Eu escuto muito debate sobre isso, especialmente ao usar um ORM
Camada de dados -> Classes de entidade (carro, van, motocicleta), DbContext - Camada de tecnologia de acesso a dados em concreto