====== Arquitetura da solução ====== ====== Introdução ====== * A arquitetura da solução determina um fluxo de desenvolvimento que facilita a compreensão do desenvolvedor, agilizando o processo de concepção do projeto, manutenção e melhoria contínua. Uma arquitetura pode ser definida por um padrão a ser absorvido por toda a empresa ou de acordo com a necessidade do projeto em questão, pode conter padrões de projeto, que são algumas boas práticas conhecidas para diversos tipos de solução, ou algum padrão determinado pela empresa pela qual o projeto será desenvolvido, desde que tenha como objetivo, simplificar o entendimento, e agilizar a manutenção. * A arquitetura escolhida para o projeto Merenda.online consiste em bibliotecas de classes desacopladas, sendo que cada uma tem o seu papel definido na solução, cada biblioteca poder ser mantida separadamente. O objetivo principal dessa separação é a manutenção posterior a entrega, ou seja, as correções, alterações ou inclusões de funcionalidades, dessa forma com o projeto em camadas fica claro o fluxo de classes a serem alteradas para que a demanda seja entregue, uma outra necessidade dessa divisão, é permitir a cobertura dos testes unitários das bibliotecas desacopladas como modelos de dados e serviço. ====== Requisitos da Arquitetura ====== * É premissa da arquitetura escolhida a abstração das classes de domínio sendo o core do sistema, dessa forma implementando conceitos das boas praticas de DDD (Domain Driven Development) a camada de dados fica responsável pelas entidades e suas regras de negócio e a camada de serviço gerencia as regras de negocio. * O template de projeto utilizado para o projeto web, é o ASP.NET MVC no qual a camada model é responsável pela comunicação do controle com a visão, a camada visão é responsável pela a interface com o usuário e o controle é responsável por gerenciar as requisições web. ====== Camadas da Arquitetura ====== ===== Classes de Domínio ===== Camada principal da arquitetura, armazena todos objetos do projeto e o mapeamento POCO (Code First) do ORM Entity Framework, responsável por armazenar a regra de negocio de cada entidade, essa camada não depende de nenhuma outra camada. ===== Classes de Repositório ===== Camada pretende criar uma abstração entre a camada de domínio e a lógica de negócio, um repositório genérico consulta a fonte de dados para os dados, mapeia os dados da fonte de dados para uma entidade e persiste as mudanças na entidade para a fonte de dados. ===== Classes de Serviços ===== Camada com os serviços responsáveis pela comunicação entre a interface com o usuário e o repositório. Responsável por gerenciar as regras de negócio das entidades. ===== Interface do Usuário ===== Camada mais externa da aplicação. Nessa camada é armazenada as validações e regras de negócio na visão do usuário, também implementado a inversão de dependência construindo assim uma aplicação menos acoplada comunicando com as outras camadas por interface. ====== Implementação da Arquitetura ====== ===== School.Model ===== * Essa é a camada principal da solução, dessa forma a solução deve ser baseada em seus domínios e negócio a partir da implementação dessa camada. Dependência de API igual ou maior: * Como pode ser observado, no conceito de DDD, o projeto de domínio no caso School.Model não deve depender de outras implementações que não sejam base de uma classe c#, como bibliotecas de terceiros. ===== School.Repository ===== Camada com a responsabilidade de armazenar as classes de repositório e o contexto de dados. Para utilizar o ADO.NET Entity Framework Code First é necessário criar um contexto de acesso a dados herdando da classe DBContext. Nessa classe é sobrescrito o método OnModelCreating(), esse método é chamado quando o modelo (schoolContext) foi inicializado e antes de ser finalizado, dessa forma ainda pode ser configurado, no caso instanciando o mapeamento de cada entidade. ===== School.Business===== As lógicas do negócio até então implementadas no modelo são gerenciadas no projeto business. {{:softwares:schoolweb:requisitos:documentacao_tecnica:arquitetura:alunoservice.png|}} ===== School.Web ===== Camada externa da solução pela qual o usuário irá interagir com a aplicação. Criada uma Aplicação Web ASP.NET MVC. Essa camada comunica com a School.Service. Para serem utilizados como serviço as propriedades como contexto, uma fabrica de objeto deve ser criada e mantida para que o serviço esteja disponível. {{:softwares:schoolweb:requisitos:documentacao_tecnica:arquitetura:factory.png|}} Assim os serviços podem ser utilizados no controle das entidades. ==== View Model ==== Camada responsável por armazenar as validações a nível de usuário. ==== View ==== Camada responsável pela interface com o usuário. Para o projeto Merenda.online foi definida a utilização do componente Devexpress e Devextreme, uma biblioteca com componentes javascript que permite serem manipulados. Dependências de API igual ou maior: ==== Controller ==== Dependências de API igual ou maior: Camada responsável por gerenciar as requisições web. Com objetivo de manter a relação entre as validações da entidade e as validações de usuário implementadas no ViewModel. ===== School.Tests ===== A finalidade do projeto é cobrir o máximo possível de operações das entidades, como validações de domínio e serviços. Dependências de API igual ou maior: