Wprowadzenie
Clean Architecture to podejście architektoniczne, które zyskuje coraz większą popularność w świecie .NET. W tym artykule pokażę, jak praktycznie wdrożyć te zasady w projekcie bankowym.
Kluczowe zasady
Clean Architecture opiera się na kilku fundamentalnych zasadach:
- Niezależność od frameworków - logika biznesowa nie powinna zależeć od konkretnego frameworka
- Testowalność - reguły biznesowe można testować bez UI, bazy danych czy serwera
- Niezależność od UI - można łatwo zmienić interfejs użytkownika
- Niezależność od bazy danych - logika biznesowa nie jest związana z konkretną bazą
Implementacja z MediatR
MediatR świetnie wspiera implementację Clean Architecture poprzez wzorzec mediator:
public class CreateAccountCommand : IRequest<AccountDto>
{
public string AccountNumber { get; set; }
public decimal InitialBalance { get; set; }
}
public class CreateAccountHandler : IRequestHandler<CreateAccountCommand, AccountDto>
{
private readonly IAccountRepository _repository;
public CreateAccountHandler(IAccountRepository repository)
{
_repository = repository;
}
public async Task<AccountDto> Handle(CreateAccountCommand request,
CancellationToken cancellationToken)
{
// Logika biznesowa
var account = Account.Create(request.AccountNumber, request.InitialBalance);
await _repository.AddAsync(account);
return AccountDto.FromEntity(account);
}
}
Pipeline Behaviors
Jedną z największych zalet MediatR są pipeline behaviors, które pozwalają na eleganckie dodawanie cross-cutting concerns:
public class ValidationBehavior<TRequest, TResponse>
: IPipelineBehavior<TRequest, TResponse>
{
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)
{
var context = new ValidationContext<TRequest>(request);
var failures = _validators
.Select(v => v.Validate(context))
.SelectMany(result => result.Errors)
.Where(f => f != null)
.ToList();
if (failures.Any())
{
throw new ValidationException(failures);
}
return await next();
}
}
Korzyści w środowisku bankowym
W regulowanym środowisku bankowym Clean Architecture przynosi szczególne korzyści:
- Auditability - jasny podział odpowiedzialności ułatwia audyty
- Testability - łatwiejsze spełnienie wymogów testowych
- Maintainability - niższe koszty utrzymania w długim terminie
- Security - łatwiejsze wdrażanie security controls
Podsumowanie
Clean Architecture z MediatR to potężna kombinacja dla projektów .NET, szczególnie w środowiskach regulowanych. Wymaga pewnej początkowej inwestycji w strukturę projektu, ale zwraca się szybko poprzez łatwiejsze utrzymanie i rozbudowę systemu.
W kolejnych artykułach pokażę bardziej zaawansowane wzorce i techniki implementacji.