You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Sistema de gestión de dispositivos IoT para hogares inteligentes (cámaras, alarmas, luces inteligentes), construido con .NET 8, Clean Architecture y Domain-Driven Design (DDD).
Arquitectura
El proyecto sigue Clean Architecture estricta con DDD. Las dependencias apuntan siempre hacia adentro:
El proyecto incluye 69 tests unitarios de dominio (IoT.Domain.Tests) que cubren:
Archivo
Qué valida
ValueObjectTests.cs
Inmutabilidad y validaciones de NombreEscena, DireccionFisica, VersionFirmware, IdentificadorFisico
HogarTests.cs
Invariantes del AR: habitaciones duplicadas, habitación ajena, eventos elevados
EscenaYComandoTests.cs
Escena inactiva/sin acciones, orden de acciones, máquina de estados de ComandoDispositivo
EstadoDispositivoTests.cs
Lecturas antiguas descartadas, EstadoCambiado solo cuando hay cambio real, detección de anomalías
SvcValidacionComandoTests.cs
Comandos válidos/inválidos por tipo, dispositivo desconectado
dotnet test tests/IoT.Domain.Tests
Cómo ejecutar
Requisito: .NET 8 SDK
# Compilar toda la solución
dotnet build IOT.sln
# API REST (la base de datos SQLite se crea automáticamente)
dotnet run --project src/IoT.API
# → Swagger: https://localhost:{puerto}/swagger# Consola interactiva
dotnet run --project src/IoT.ConsoleApp
# Tests
dotnet test tests/IoT.Domain.Tests
# Publicar en Release
dotnet publish src/IoT.API -c Release
ASP.NET Core Web API · Swashbuckle (Swagger) 6.9.0
Caché
Microsoft.Extensions.Caching.Memory 8.0.1
Tests
xUnit 2.5.3
Mensajería
Stub en consola (diseñado para RabbitMQ/Kafka sin cambiar el dominio)
Notas de implementación
La base de datos SQLite se crea automáticamente con EnsureCreated() al iniciar; no hay migraciones de EF.
Los domain events HogarRegistrado y EscenaCreada se publican después de SaveChangesAsync() para garantizar que el ID generado por la base de datos sea el correcto.
La ejecución de escenas usa una transacción explícita (BeginTransactionAsync / CommitAsync / RollbackAsync) gestionada por EscenaController.
ISaveChanges e IUnitOfWork resuelven la misma instancia de UnitOfWork por scope de DI.
About
Sistema para gestionar y controlar dispositivos IoT desde una interfaz centralizada.