Durată: 5 zile
Certificare: Diploma de participare

Mid-level C# Developers (2+ years of experience) looking to level up their structural design and architectural skills.
This training establish a strong baseline in software design principles and explore how modern C# features naturally support clean code. Move beyond academic GoF (Gang of Four) definitions and see how design patterns are actually implemented and used within the .NET ecosystem. Zoom out from individual classes to structural architecture, focusing on keeping the core domain pure and isolated. Address the complexities of modern web applications, scaling, and separating read/write workloads.
1. Foundations & Idiomatic C#
Objective: Establish a strong baseline in software design principles and explore how modern C# features naturally support clean code.
1.1: The Pillars of Clean Code
Beyond the buzzwords: DRY (Don't Repeat Yourself), KISS (Keep It Simple, Stupid), and YAGNI (You Aren't Gonna Need It).
The SOLID Principles in C#:
1.2: Idiomatic C# & Modern Features
Data Structures: When to use class, struct, and modern record types for immutability.
Expressive Code: Leveraging Pattern Matching, LINQ best practices, and avoiding hidden performance traps (e.g., multiple enumerations).
Error Handling: Exceptions vs. the Result/Monad pattern for domain logic.
1.3: Mastering Asynchronous Programming
The mechanics of async and await.
Deadlocks, ConfigureAwait(false), and avoiding async void.
Performance optimizations: Task vs. ValueTask.
1.4: Native Dependency Injection (DI) in .NET
Understanding the IServiceCollection and the built-in IoC container.
Service Lifetimes: Transient, Scoped, and Singleton.
2. Pragmatic Design Patterns in .NET
Objective: Move beyond academic GoF (Gang of Four) definitions and see how design patterns are actually implemented and used within the .NET ecosystem.
2.1: Creational Patterns & Configuration
Factory & Abstract Factory: Abstracting complex object creation.
Builder Pattern: Fluent APIs in C#.
.NET Specific: The Options Pattern (IOptions<T>, IOptionsSnapshot<T>) for strongly-typed configuration management.
2.2: Structural Patterns for Extensibility
Decorator Pattern: Adding behavior dynamically (perfect for caching, logging, and retry logic).
Adapter & Facade: Bridging legacy systems and simplifying complex subsystems.
Real-world .NET: How ASP.NET Core Middleware acts as a pipeline of Decorators/Chain of Responsibility.
2.3: Behavioral Patterns
Strategy Pattern: Swapping algorithms at runtime (e.g., different payment gateways, tax calculators).
Observer Pattern: Traditional C# events vs. IObservable<T> (Reactive Extensions - Rx.NET).
Null Object Pattern: Avoiding repetitive null checks.
3. Enterprise Architecture & Domain-Driven Design (DDD)
Objective: Zoom out from individual classes to structural architecture, focusing on keeping the core domain pure and isolated.
3.1: Clean & Onion Architecture: Inverting dependencies to put the Domain at the center. Structuring .NET projects to enforce these boundaries.
3.2: Introduction to Domain-Driven Design (DDD):
Ubiquitous Language and Bounded Contexts.
Tactical DDD: Entities, Value Objects, and Aggregates.
Rich vs. Anemic Domain Models.
3.3 Data Access Patterns: Evaluating the Repository and Unit of Work patterns when using Entity Framework Core. Where to put data-saving logic cleanly.
4. Distributed Systems & CQRS
Objective: Address the complexities of modern web applications, scaling, and separating read/write workloads.
4.1: Command Query Responsibility Segregation (CQRS): Separating read models (queries) from write models (commands) to optimize performance and scale.
4.2: The Mediator Pattern: Implementing CQRS using the MediatR library. Managing cross-cutting concerns (validation, logging, transactions) via MediatR Behaviors.
4.3: Microservices & Integration Patterns:
API Gateways and the Backends for Frontends (BFF) pattern.
Event-Driven Architecture basics: Integration events vs. Domain events.
The Outbox Pattern: Ensuring reliable messaging without distributed transactions.
4.4: Resiliency with Polly: Implementing retries, circuit breakers, and fallbacks for robust HTTP calls between microservices.
06DM