Zum Hauptinhalt springen
Echtzeit-Radar & Feeds
Alle RSS Feeds ➔
👥 Community & Social
Windows Tipps & SecurityGrafikkarte vor Überhitzung schützen: So geht’s(25.09.2026 um 08:00 Uhr)
••••••••••
Windows Tipps & SecurityGrafikkarte vor Überhitzung schützen: So geht’s(25.09.2026 um 08:00 Uhr)
••••••••••
Intelligence View
⚡ tsecurity.de Intelligence

FluentValidation en .NET 10 sin ensuciar tus entidades (Clean Architecture + MediatR)

Hola a Todos. Uno de los errores más comunes al construir aplicaciones en .NET es mezclar validaciones directamente en las entidades usando atributos como: [Required] [MaxLength] [EmailAddress] Aunque esto funciona, introduce varios …

0
↗ Quelle (dev.to)
Reagiere als Erste:r — dein Feedback zählt!

Hola a Todos. Uno de los errores más comunes al construir aplicaciones en .NET es mezclar validaciones directamente en las entidades usando atributos como:




  • [Required]

  • [MaxLength]

  • [EmailAddress]



Aunque esto funciona, introduce varios problemas:




  • ❌ Acopla el dominio a frameworks como ASP.NET

  • ❌ Dificulta las pruebas unitarias

  • ❌ Mezcla responsabilidades

  • ❌ Reduce reutilización



En este artículo veremos cómo usar FluentValidation de forma correcta en .NET 10, siguiendo Clean Architecture y usando MediatR, manteniendo el dominio completamente limpio.






🧨 El problema: entidades contaminadas






public class User
{
public string Name { get; set; }

[Required]
[EmailAddress]
public string Email { get; set; }
}









¿Qué está mal aquí?




  • La entidad depende de System.ComponentModel.DataAnnotations

  • No puedes reutilizarla fácilmente fuera de ASP.NET

  • Las validaciones no son fácilmente testeables de forma aislada






✅ Principio clave: dominio limpio



En Clean Architecture, el dominio debe ser:




  • Independiente

  • Puro

  • Libre de frameworks






Entidad correcta






public class User
{
public string Name { get; set; }
public string Email { get; set; }
}






Sin validaciones, sin atributos y sin dependencias externas.









🧠 ¿Dónde deben ir las validaciones?



En la Application Layer, no en el dominio.



Ahí es donde FluentValidation realmente brilla.









🔥 Instalación






dotnet add package FluentValidation
dotnet add package FluentValidation.DependencyInjectionExtensions
dotnet add package MediatR
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection












✍️ Caso real: crear usuario con CQRS + MediatR






1. Command






using MediatR;

public record CreateUserCommand(string Name, string Email) : IRequest<Guid>;












2. Validator






using FluentValidation;

public class CreateUserCommandValidator : AbstractValidator<CreateUserCommand>
{
public CreateUserCommandValidator()
{
RuleFor(x => x.Name)
.NotEmpty()
.WithMessage("El nombre es obligatorio")
.MaximumLength(100);

RuleFor(x => x.Email)
.NotEmpty()
.WithMessage("El email es obligatorio")
.EmailAddress()
.WithMessage("Email inválido");
}
}






Aquí está la gran ventaja: las reglas viven fuera del dominio.









⚙️ Handler de MediatR






using MediatR;

public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, Guid>
{
public async Task<Guid> Handle(CreateUserCommand request, CancellationToken cancellationToken)
{
var user = new User
{
Name = request.Name,
Email = request.Email
};

// Simulación de persistencia
return Guid.NewGuid();
}
}






En este punto el request ya llega validado gracias al pipeline.









🧩 Validación automática con MediatR Pipeline Behavior



Aquí es donde el enfoque se vuelve mucho más potente.



En vez de validar manualmente en cada handler, puedes centralizar toda la validación usando un PipelineBehavior.




using FluentValidation;
using MediatR;

public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : notnull
{
private readonly IEnumerable<IValidator<TRequest>> _validators;

public ValidationBehavior(IEnumerable<IValidator<TRequest>> validators)
{
_validators = validators;
}

public async Task<TResponse> Handle(
TRequest request,
RequestHandlerDelegate<TResponse> next,
CancellationToken cancellationToken)
{
if (_validators.Any())
{
var context = new ValidationContext<TRequest>(request);

var validationResults = await Task.WhenAll(
_validators.Select(v => v.ValidateAsync(context, cancellationToken))
);

var failures = validationResults
.SelectMany(r => r.Errors)
.Where(f => f != null)
.ToList();

if (failures.Any())
{
throw new ValidationException(failures);
}
}

return await next();
}
}






Con esto, cualquier command que tenga un validator se valida automáticamente.









🧱 Registro en Program.cs






using FluentValidation;
using MediatR;

builder.Services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(CreateUserCommand).Assembly);
});

builder.Services.AddValidatorsFromAssembly(typeof(CreateUserCommandValidator).Assembly);

builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));












🌐 Uso desde Minimal API






app.MapPost("/users", async (CreateUserCommand command, IMediator mediator) =>
{
var result = await mediator.Send(command);
return Results.Ok(result);
});






No necesitas escribir validaciones manuales en controllers ni endpoints.









🧪 Testing del Validator



Una de las grandes ventajas de FluentValidation es que puedes probar las reglas fácilmente.




using FluentValidation.TestHelper;
using Xunit;

public class CreateUserCommandValidatorTests
{
private readonly CreateUserCommandValidator _validator = new();

[Fact]
public void Should_Have_Error_When_Email_Is_Invalid()
{
var command = new CreateUserCommand("Romny", "correo-invalido");

var result = _validator.TestValidate(command);

result.ShouldHaveValidationErrorFor(x => x.Email);
}
}












⚖️ Validar DTO o validar entidad



Una de las preguntas más comunes es: ¿debo validar la entidad o el DTO?



La recomendación es validar Commands o DTOs.



¿Por qué?




  • Representan la entrada del sistema

  • No contaminan el dominio

  • Mantienen mejor separación de responsabilidades

  • Encajan mejor con CQRS









🚫 Anti-patrones comunes






Validar en Controllers






if (string.IsNullOrEmpty(request.Email))
{
throw new Exception("Email inválido");
}









Validar en entidades






[Required]
public string Email { get; set; }









Mezclar validación con lógica de negocio






if (request.Email.Contains("gmail"))
{
// lógica de negocio
}












✅ Buenas prácticas




  • Validar en Application Layer

  • Usar FluentValidation

  • Validar Commands y DTOs

  • Integrar validación automática con MediatR

  • Mantener el dominio limpio

  • Escribir pruebas unitarias para validadores









🧠 Conclusión



Usar FluentValidation con Clean Architecture y MediatR en .NET 10 te permite:




  • Separar responsabilidades correctamente

  • Tener validaciones testeables

  • Centralizar validaciones

  • Mantener el dominio limpio

  • Escalar la arquitectura sin deuda técnica



Si estás construyendo sistemas modernos en .NET, este enfoque ya no es un extra: es prácticamente el estándar.









🎯 TL;DR




  • No pongas validaciones en entidades

  • Usa FluentValidation en Application Layer

  • Integra con MediatR usando Pipeline Behavior

  • Valida Commands y DTOs, no Domain Models

  • Mantén el dominio limpio



Espero con esto poder ayudarlos.



Sl2



Romny

1. Sofort-Triage & Abwehrmaßnahmen

SOC Incident Playbook: Vulnerability Remediation & Verification
Syntax validiert (0 Fehler)
title: Detect Exploitation - FluentValidation en .NET 10 sin ensuciar tus entidades (Clean Architecture + MediatR)
id: 24952a7d-aef5-4d4a-8501-6cfcda361cb8
status: experimental
description: Automatisch generierte SIEM-Erkennungsregel basierend auf CTI Intelligence
references:
  - https://tsecurity.de/
author: iShareStuff CTI Automated Detection Engine
date: 2026-09-26
logsource:
  category: network_connection
  product: any
detection:
  selection:
      CommandLine|contains:
        - 'exploit'
  condition: selection
falsepositives:
  - Legitime administrative Zugriffe oder Penetrationstests
level: high
tags:
  - attack.initial_access
Syntax validiert (0 Fehler)
rule CTI_Threat_Indicator {
    meta:
        author = "iShareStuff CTI Automated Detection Engine"
        date = "2026-09-26"
        description = "YARA Signature for "
    strings:
        $str = "FluentValidation en .NET 10 si" ascii wide
    condition:
        any of them
}
Syntax validiert (0 Fehler)
index=security sourcetype IN ("cisco:asa", "pan:traffic", "zeek_conn", "suricata", "WinEventLog:Security")
("FluentValidation en NET 10 sin ensuciar ")
| stats count earliest(_time) as first_seen latest(_time) as last_seen by src_ip, dest_ip, dest_host, signature
| eval first_seen=strftime(first_seen, "%Y-%m-%d %H:%M:%S"), last_seen=strftime(last_seen, "%Y-%m-%d %H:%M:%S")
| sort - count
Syntax validiert (0 Fehler)
message: "*FluentValidation en NET 10 sin ensuciar *"
Syntax validiert (0 Fehler)
CommonSecurityLog
| where Message has "FluentValidation en NET 10 sin ensuciar "
| summarize EventCount = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) by SourceIP, DestinationIP, DestinationPort, Activity
| extend DetectionRule = "iShareStuff-CTI-Compiled"
| sort by EventCount desc

2. Cyber Threat Intelligence & Forensik

CTI Threat Relationship Graph2 Knoten / 1 Relationen
CVE / Incident Software MITRE ATT&CK CWE Weakness IoC
🎯
MITRE ATT&CK Matrix Navigator 14 Taktiken
Reconnaissance
-
Resource Development
-
Initial Access
Execution
Persistence
-
Privilege Escalation
Defense Evasion
Credential Access
-
Discovery
-
Lateral Movement
-
Collection
-
Command and Control
Exfiltration
-
Impact
tsecurity.de Cognitive Threat RAG
Fokus-Vektor:

Kognitive Analyse für identifizierte Bedrohung: Erhöhte Bedrohungslage im Bereich FluentValidation en .NET 10 sin ensuciar.... Basierend auf 368k Vektor-Korrelationen werden sofortige Isolationsmaßnahmen für betroffene Endpunkte empfohlen.

🛡️ Angriffsfläche & Exposure

Netzwerk/Remote-Zugriff ohne Vorauthentifizierung möglich.

⚡ Empfohlene Sofortmaßnahmen
  • 1. Perimeter-Inspektion: Relevante Portfreigaben und exponierte Endpunkte unverzüglich scannen.
  • 2. Patch-Applikation: Hersteller-Hotfix einspielen oder betroffene Daemons in isolierte DMZ-Segmente überführen.
  • 3. Telemetrie & EDR-Alerts: Prozessaufrufe und Child-Processes auf anomale Shell-Spawns überwachen.
🔗 Semantisch verwandte Zero-Days MariaDB 11.7 VEC
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten FluentValidation en .NET 10 sin ensuciar tus entidades (Clean Architecture + MediatR)

Thematisch verwandte Begriffe: FluentValidation, ensuciar, entidades, Clean · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Zum Aktualisieren ziehen
ZERO-DAY CVE-2026-100618 | Capgo (capgo.app) is affected by an authorization flaw in the app icon …
Advisory →
tsecurity.de Icon
Offline-Lesen, Eilmeldungen & 0ms Ladezeit

Installiere tsecurity.de direkt auf deinen Home-Bildschirm für das ultimative Vollbild-Magazinerlebnis ohne Browser-Leisten.

Nächster Beitrag