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:

  1. Niezależność od frameworków - logika biznesowa nie powinna zależeć od konkretnego frameworka
  2. Testowalność - reguły biznesowe można testować bez UI, bazy danych czy serwera
  3. Niezależność od UI - można łatwo zmienić interfejs użytkownika
  4. 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.