Code Monkey home page Code Monkey logo

clean-arch-mvc's Introduction

Clean-Architecture-Essencial

Criando projetos .NET Core segundo a Clean Architecture

Conceitos e Fundamentos

Acesse aqui

Proposito

Criação de uma aplicação ASP.NET Core 5.0 MVC e estudo dos seguintes temas:

  • Separação de Conceitos
  • Inversão de dependência
  • Injeção de dependência
  • Padrão MVC
  • Padrão Repository
  • Padrão CQRS
  • Arquitetura Monolítica
  • Arquitetura em Camadas
  • Arquitetura Cebola
  • Conceitos do Domain Drive Design

Vamos passar de uma solução monolitica a partir do template padrão do Visual Studio para uma solução contendo 5 projetos, respeitando a sepação de conceitos dada a modelagem feita via DDD.

Ferramentas Utilizadas

  • .NET Core SDK
  • ASP.NET Core
  • Visual Studio ou Visual Studio Code
  • SQL Server
  • SQL Server Management Studio

Comandos Básicos

dotnet new - cria um novo projeto.
dotnet --version - lista a versão do dotnet vinculado aquele alias.

dotnet new mvc -o mvctest - cria um novo projeto do tipo MVC criando uma pasta de mesmo nome.
dotnet new mvc -o mvctest --name mvctest1 - cria um novo projeto do tipo MVC criando uma pasta de nome mvctest e o nome do projeto fica mvctest1.

dotnet restore - restaura pacotes do projeto. (???).
dotnet run - executa o projeto.

dotnet build - dá build o projeto.
dotnet publish - publica o projeto.

dotnet test - testa o projeto.
dotnet clean - limpa o projeto(???).

dotnet sln - (???).
dotnet help - é bem claro.

dotnet pack - empacota o projeto.(???)
dotnet migrate - migra o projeto.(???)

dotnet store - registra o projeto.(???)
dotnet vtest - (???)

Comandos de modificação de projeto

dotnet add package - adiciona pacotes ao projeto.
dotnet add reference - adiciona referencias ao projeto. (???)

dotnet remove package - remove pacotes ao projeto.
dotnet remove reference - remove referencias ao projeto. (???)

Comandos avançados

nuget delete - (???)
nuget locals - (???)

nuget push - (???)
msbuild - (???)

dotnet install script - (???)

Tipos de projetos

  • MVC
  • ClassLib
  • Web
  • Webapp
  • SLN
  • Mstest
  • Xunit
  • Webconfig
  • Razor
  • Console
  • Angular

Comandos para criação de Solution

dotnet new sln - cria a Solution usando o nome da pasta atual.
dotnet new sln -o - cria a Solution usando a pasta com o nome indicado, caso não exista a pasta será criada.

dotnet new sln --name - cria a Solution especificando o nome na pasta atual.
dotnet new sln -o --name - cria a Solution especificando o nome na pasta com o nome indicado.

Gerenciar projetos na solução

dotnet sln Solution1.sln add Project1.csproj - adiciona o projeto 1 a solução 1.
dotnet sln Solution1.sln add path/Project1.csproj path/Project2.csproj - adiciona os projetos 1 e 2 a solução 1, podendo estar em caminhos diferentes.

dotnet sln Solution1.sln remove Project1.csproj - remove o projeto 1 a solução 1.
dotnet sln Solution1.sln remove path/Project1.csproj path/Project2.csproj - remove os projetos 1 e 2 a solução 1, podendo estar em caminhos diferentes.

dotnet sln Solution1.sln list - lista os projetos dentro da solução 1.


Definindo o projeto - Escopo Geral

Criar um projeto Web para tratar com produto se categorias que podem ser usados para criar catálogo de produtos de vendas;

  • Criar uma aplicação ASP .NET Core MVC no Visual Studio Community (VS Code) que permita o gerenciamento de produtos e categorias;
  • Definir no projeto as funcionalidades para poder consultar, criar, editar e excluir (CRUD) produtos e categorias;
  • Definir o modelo de domínio usando classes e com propriedades e comportamentos: Product e Category;
  • Definir qual arquitetura a ser usada no projeto: Usar a abordagem da Clean Architecture;
  • Definir os padrões que iremos implementar no projeto: MVC, Repository e CQRS;
  • Definir os atributos para o domínio Product:
    • Id (int, Identity)
    • Narge (string)
    • Description(string)
    • Price(decimal)
    • Stock(int)
    • Image(string)
  • Definir os atributos para o dominio Category:
    • Categoryld (int, Identity)
    • Name(string)
  • Definir o relacionamento usado: teremos um relacionamento um-para-muitos entre Categoria e Produto;

Definição das regras de negócio do Produto

  • Definir a funcionalidade para exibir os produtos;
  • Definir a funcionalidade para criar um novo produto;
  • Permitir alterar as propriedades de um produto existente (O ld do produto não poderá ser alterado);
  • Definir a funcionalidade para excluir um produto existente pelo seu ld;
  • Definir o relacionamento do produto com a categoria (propriedade de navegação);
  • Não permitir a criação de um produto com estado inconsistente (criar um construtor parametrizado);
  • Não permitir que os atributos do produto sejam alterados externamente (setter privados);
  • Não permitir que os atributos ld, Stock e Price possuam valores negativos;
  • Não permitir que os atributos Name, Description sejam nulos ou vazios;
  • Permitir que o atributo Image seja null;
  • O atributo Name não poderá conter menos que 3 caracteres;
  • O atributo Description não poderá conter menos que 5 caracteres;
  • O atributo Image não poderá conter mais que 250 caracteres;
  • O atributo Image será armazenado como uma string e o seu arquivo será separado em uma pasta do projeto;
  • Definir a validaçõa das regras de negócio para o domínio Produto;

Definição das regras de negócio da Categoria

  • Definir a funcionalidade para exibir as categorias;
  • Definir a funcionalidade para criar uma nova categoria;
  • Permitir alterar as propriedades de uma categoria existente (O Id da categoria não poderá ser alterado);
  • Definir a funcionalidade para excluir uma categoria existente pelo seu ld;
  • Definir o relacionamento entre categoria e produto (propriedade de navegação);
  • Não permitir a criação de uma categoria com estado inconsistente (criar um construtor parametrizado);
  • Não permitir que os atributos da categoria sejam alterados externamente (setter privados);
  • Não permitir que o atributo Categoryld tenha valor negativo;
  • Não permitir que o atributos Name seja null ou vazio;
  • O atributo Name nāo poderá conter menos que 3 caracteres;
  • Definir a validação das regras de negócio para o domínio Categoria;

Persistência dos dados usada no projeto

  • Usar banco de dados relacional: SQL Server (MySql, PostgreSql, sQLite, Oracle, etc.);
  • Usar a ferramenta ORM: Entity Framework Core;
  • Usar a abordagem Code-First do Entity Framework Core para criar o banco de dados e as tabelas;
  • Provedor do banco de dados: Microsoft.EntityFrameworkCore.SqlServer;
  • Ferramenta para aplicar o Migrations: Microsoft.EntityFrameworkCore.Tools
  • Desacoplar a camada de acesso a dados do ORM: Padrão Repository;

Nomenclatura

Usar a nomenclatura recomendada pela Microsoft para nomear classes, métodos, parâmetros e variáveis

  • CamelCase: Em palavras compostas ou frases, a primeira letra da primeira palavra é iniciada com minúscula e unidas sem espaços. Ex: valorDo Desconto, nomeCompleto
  • PascalCase: Em palavras compostas ou frases montadas com palavras, a primeira letra de cada palavra é iniciada com maiúíscula. Ex: CalculalmpostoDeRenda0, ValorDoDesconto

Estrutura do projeto

Criação de uma solução e 6 projetos separados em camadas com responsabilidades definidas, como a clean architecture sugere;

O nome da soluçaão será: CleanArchMvc e os projetos são:

  • CleanArchMvc.Domain: Modelo de domínio, regras de negócio, interfaces;
  • CleanArchMvc.Domain.Tests: Testes unitários do dominío;
  • CleanArchMvc.Application: Regras de domínio da aplicação, mapeamentos, serviços, DTOs, CQRS;
  • CleanArch Mvc.Infra.Data: EF Core, Contexto, Configurações, Migrations, Repository; CleanArchMvc.Infra.loc : Dependency Injection, registro dos serviços, tempo de vida; -CleanArch Mvc.WebUI: MVC, Controllers, Views, Filtros, ViewModels;

Obs: O projeto CleanArchMvc.WebUl é do tipo ASP .NET Core Web App (Model-View-Controller); Os demais projetos serão do tipo Class Library (.NET 5.0);

Relacionamento e dependência entre os projetos

  • CleanArchMvc.Domain: Não possui nenhuma dependência
  • CleanArchMvc.Domain.Tests: Dependência como projeto: Domain
  • CleanArchMvc.Application: Dependência como projeto: Domain
  • CleanArchMvc.Infra.Data: Dependência com o projeto: Domain
  • CleanArchMvc.Infra.loC: Dependência com os projetos: Domain, Application, Infra. Data
  • CleanArchMvc.WebUI: Dependência com o projeto: Infra.loc

Componentes distribuídos por camadas e responsabilidade

clean-arch-mvc's People

Contributors

victorfariasoliveira avatar

Stargazers

Filipe Lima avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.