/DDD-NET-CORE

Ejemplo practico utilizando la arquitectura DDD (domain driven design) con NET CORE 2.1 y Visual Code (editor de texto).

Primary LanguageJavaScript

Ejemplo práctico implementado con la arquitectura DDD (Domain Driven Design) usando NET CORE 2.1, Entity Framework Core, GraphQL y Visual Code (editor de texto).

Requisitos

Comandos útiles NET CORE 2.1

Documentación de apoyo

  • dotnet clean
  • dotnet build
  • dotnet run -p 1-Presentation/api/api.csproj

Plugins útiles Visual Code

Paso I

Con este paso podrá realizar "Hola Mundo" sobre la arquitectura DDD, rama del proyecto HolaMundo

Creando proyecto DDD

Ejecute los siguientes comandos en un shell o cmd:

  1. Crea la carpeta raíz del proyecto md DDD.NET.CORE
  2. Acceder al proyecto cd DDD.NET.CORE
  3. Crear la estructura del proyecto:
  • Capa: presentación
    • md 1-Presentation
    • md api
    • cd api
    • dotnet new webapi
    • cd .. cd .. (Regresar a la carpeta raíz)
  • Capa Aplicación
    • md 2-Application
    • cd 2-Application
    • dotnet new classlib
    • cd . . (Regresar a la carpeta raíz)
  • Capa Dominio
    • md 3-Domain
    • cd 3-Domain
    • dotnet new classlib
    • cd . . (Regresar a la carpeta raíz)
  • Capa Dominio entidad
    • md 3.1-Domain.Entities
    • cd 3.1-Domain.Entities
    • dotnet new classlib
    • cd . . (Regresar a la carpeta raíz)
  1. Agregar la solución del proyecto
    • dotnet new sln

Agregando referencias

Ejecute los siguientes comandos en un shell o cmd (Raíz del proyecto):

  • dotnet add 1-Presentation/api/api.csproj reference 2-Application/2-Application.csproj 3.1-Domain.Entities/3.1-Domain.Entities.csproj 4-Infrastructure/4-Infrastructure.csproj

  • dotnet add 2-Application/2-Application.csproj reference 3-Domain/3-Domain.csproj 3.1-Domain.Entities/3.1-Domain.Entities.csproj

  • dotnet add 3-Domain/3-Domain.csproj reference 3.1-Domain.Entities/3.1-Domain.Entities.csproj

  • dotnet add 4-Infrastructure/4-Infrastructure.csproj reference 3-Domain/3-Domain.csproj 3.1-Domain.Entities/3.1-Domain.Entities.csproj

Agregando los proyectos a la solución del proyecto

Ejecute el siguiente comando en un shell o cmd (Raíz del proyecto):

dotnet sln DDD.NET.CORE.sln add 1-Presentation/api/api.csproj 2-Application/2-Application.csproj 3-Domain/3-Domain.csproj 4-3.1-Domain.Entities/3.1-Domain.Entities.csproj 4-Infrastructure/4-Infrastructure.csproj 

Paso II

Con este paso podrá conectarse a una base de datos usando Entity Framework Core, rama del proyecto EntityFameworkCore

Instalar Entity Famework

Ejecute los siguientes comandos en un shell o cmd (raíz del proyecto) Documentación de apoyo

  • Capa: presentación
    • cd 1-Presentation/api/
    • dotnet add package Microsoft.EntityFrameworkCore
    • dotnet add package Microsoft.EntityFrameworkCore.SqlServer
    • dotnet add package Microsoft.Extensions.Configuration
    • dotnet add package Microsoft.Extensions.Configuration.Json
    • cd .. cd .. (Regresar a la carpeta raíz)
  • Capa: Infraestructura
    • cd 4-Infrastructure
    • dotnet add package Microsoft.EntityFrameworkCore
    • dotnet add package Microsoft.EntityFrameworkCore.Sqlite (opcional)
    • dotnet add package Microsoft.EntityFrameworkCore.SqlServer
    • dotnet add package Microsoft.EntityFrameworkCore.Design
    • dotnet add package Microsoft.EntityFrameworkCore.Tools
    • dotnet add package Microsoft.Extensions.Configuration
    • dotnet add package Microsoft.Extensions.Configuration.Json

Ejecutar comandos, Entity Famework

Ejecute los siguientes comandos en un shell o cmd (raíz del proyecto)

  • cd 1-Presentation/api/
  • dotnet ef migrations add CarDBExample -p ../../4-Infrastructure/4-Infrastructure.csproj
  • dotnet ef database update

Instalar NuGet

Ejecute los siguiente comando en un shell o cmd (raíz del proyecto)

  • cd 1-Presentation/api/
  • dotnet add package Newtonsoft.Json

Paso III

Con este paso podrá implementar GraphQL en la capa de presentación. Documentación de apoyo

Api GraphQL

Ejecute los siguientes comandos en un shell o cmd (raíz del proyecto) Repositorio guía

Crear servidor GraphQL

  • cd 1-Presentation
  • md api_graph_ql
  • cd api_graph_ql
  • md server
  • cd server
  • dotnet new web
  • cd .. cd .. cd .. (Regresar a la carpeta raíz)
  • dotnet sln DDD.NET.CORE.sln add 1-Presentation/api_graph_ql/server/server.csproj
  • Crear en la raiz del directorio nuget.config

<configuration>

<packageSources>

<add key="graphql-dotnet" value="https://myget.org/F/graphql-dotnet/api/v3/index.json" />

</packageSources>

</configuration>

Crear cliente GraphQL

  • cd 1-Presentation/api_graph_ql
  • md Issues
  • cd Issues
  • dotnet new classlib
  • cd .. cd .. cd .. (Regresar a la carpeta raíz)
  • dotnet sln DDD.NET.CORE.sln add .\1-Presentation\api_graph_ql\Issues\Issues.csproj

Instalar NuGet

Ejecute los siguientes comandos en un shell o cmd (raíz del proyecto)

Servidor GraphQL

  • cd 1-Presentation\api_graph_ql\server\

  • dotnet add package GraphQL.Server.Transports.AspNetCore --version 2.0.0

  • dotnet add package GraphQL.Server.Transports.WebSockets --version 2.0.0

  • dotnet add package Microsoft.AspNetCore.StaticFiles --version 2.1.1

  • dotnet add package Microsoft.EntityFrameworkCore.SqlServer

  • dotnet add package Microsoft.EntityFrameworkCore

  • dotnet add package Microsoft.EntityFrameworkCore.SqlServer

  • dotnet add package Microsoft.Extensions.Configuration

  • dotnet add package Microsoft.Extensions.Configuration.Json

  • cd .. (Regresar a la carpeta padre)

Cliente GraphQL

  • cd Issues
  • dotnet add package GraphQL --version 2.1.0
  • dotnet add package System.Reactive --version 3.1.1
  • dotnet add package Microsoft.EntityFrameworkCore.SqlServer
  • dotnet add package Microsoft.EntityFrameworkCore
  • dotnet add package Microsoft.EntityFrameworkCore.SqlServer

Agregando referencias

Ejecute los siguientes comandos en un shell o cmd (raíz del proyecto)

Servidor GraphQL

  • cd 1-Presentation\api_graph_ql\server\
  • dotnet add server.csproj reference ../../../3.1-Domain.Entities/3.1-Domain.Entities.csproj ../../../2-Application/2-Application.csproj ../../../4-Infrastructure/4-Infrastructure.csproj
  • cd .. (Regresar a la carpeta padre)

Cliente GraphQL

  • cd Issues
  • dotnet add reference ../Issues/Issues.csproj
  • dotnet add Issues.csproj reference ../../../3.1-Domain.Entities/3.1-Domain.Entities.csproj ../../../2-Application/2-Application.csproj ../../../4-Infrastructure/4-Infrastructure.csproj

Probar GraphQL

Ejecute los siguientes comandos en un shell o cmd (raíz del proyecto)

  • dotnet build
  • dotnet run -p .\1-Presentation\api_graph_ql\server\

Pegue el siguiente código en el cliente del servidor GraphQL

Documentación de apoyo Queries y Mutations

Ejemplo para consultas y persistencia Rama del proyecto GraphQL_CreatedRead

mutation createCar($car: CarInput!) {
  createCar(car: $car) {
    ...myCar
  }
}

query getCars {
  carros {
    ...myCar
  }
}

query getCar {
  carro(id: 2005) {
   ...myCar
  }
}

fragment myCar on CarType {
  id
  name
  engine
  model
}

Query Variables

{
  "car": 
  {      
    "name":"graphName",
    "engine":"graphEngine",
    "model": "2018"   
  }
}

Ejemplo para actualizar datos Rama del proyecto GraphQL_CreatedReadUpdate

mutation updateCar($update: CarInputUpdate!){
  updateCar(update: $update){
    ...myCar
  }
}

query getCars {
  carros {
    ...myCar
  }
}

fragment myCar on CarType {
  id
  name
  engine
  model
}

Query Variables

{
  "update": {
    "id": 3,
    "name": "graphNameUpdate",
    "engine": "graphEngineUpdate",
    "model": "2019"
  }
}

Ejemplo para borrado de datos Rama del proyecto GraphQL_CRUD

mutation deleteCar($carId: Int!){
  deleteCar(carId: $carId){
    id   
    name
  }
}

query getCars {
  carros {
    ...myCar
  }
}

fragment myCar on CarType {
  id
  name
  engine
  model
}

Query Variables

{
  "carId": 1
}

Paso IV

Con este paso podrá implementar WebSocket usando GraphQL Subscriptions. Documentación de apoyo

Probar GraphQL - WebSocket

Ejecute los siguientes comandos en un shell o cmd (raíz del proyecto)

  • dotnet build
  • dotnet run -p .\1-Presentation\api_graph_ql\server\

Pegue el siguiente código en el cliente del servidor GraphQL

mutation updateCar($update: CarInputUpdate!){
  updateCar(update: $update){
    ...myCar
  }
}

mutation deleteCar($carId: Int!){
  deleteCar(carId: $carId){
    id   
    name
  }
}

query getCars {
  carros {
    ...myCar
  }
}

fragment myCar on CarType {
  id
  name
  engine
  model
}

Query Variables

{
  "update": {
    "id": 2006,
    "name": "Renault",
    "engine": "1400",
    "model": "2007"
  },

En una nueva ventana en ignonito Correr el siguiente evento:

subscription{
  carEvent(statuses:[ACTUALIZADO]){
    id
    name
  }
}

Resultado: Paso_1 Paso_2 Paso_3 Paso_4