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).
- Este proyecto se probo sobre S.O Windows
- Instalar Visual Code
- Instalar Git
- Instalar NET CORE 2.1
- dotnet clean
- dotnet build
- dotnet run -p 1-Presentation/api/api.csproj
- C# ms-vscode.csharp
- vscode-solution-explorer
- C# IDE Extensions for VSCode
- .NET Core Test Explorer
- Rainbow Brackets
- Markdown Preview Enhanced
Con este paso podrá realizar "Hola Mundo" sobre la arquitectura DDD, rama del proyecto HolaMundo
Ejecute los siguientes comandos en un shell o cmd:
- Crea la carpeta raíz del proyecto md DDD.NET.CORE
- Acceder al proyecto cd DDD.NET.CORE
- 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)
- Agregar la solución del proyecto
- dotnet new sln
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
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
Con este paso podrá conectarse a una base de datos usando Entity Framework Core, rama del proyecto EntityFameworkCore
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
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
Ejecute los siguiente comando en un shell o cmd (raíz del proyecto)
- cd 1-Presentation/api/
- dotnet add package Newtonsoft.Json
Con este paso podrá implementar GraphQL en la capa de presentación. Documentación de apoyo
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
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
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
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
}
Con este paso podrá implementar WebSocket usando GraphQL Subscriptions. Documentación de apoyo
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
}
}