<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/sources/wearedotnet/best-of/2026/05" -->

---
title: Best We Are .NET posts — May 2026 | daily.dev
description: The most upvoted We Are .NET posts from May 2026, curated by the daily.dev community.
canonical: https://daily.dev/sources/wearedotnet/best-of/2026/05
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:url: https://daily.dev/sources/wearedotnet/best-of/2026/05
og:type: website
og:site_name: daily.dev
og:title: Best We Are .NET posts — May 2026 | daily.dev
og:description: The most upvoted We Are .NET posts from May 2026, curated by the daily.dev community.
og:image: https://media.daily.dev/image/upload/s--VAY5ToZt--/f_auto/v1724209435/public/daily.dev%20-%20open%20graph
---

# Best of We Are .NET — May 2026

1. 1  
[](https://daily.dev/posts/source-generators-the-build-performance-killer-nobody-warned-you-about-daily-devops-net-nhr1li6c1 "Source Generators: The Build Performance Killer Nobody Warned You About — Daily DevOps & .NET")  
Article  
![Avatar of wearedotnet](https://media.daily.dev/image/upload/s--BsnVOa3i--/f_auto/v1718347410/logos/wearedotnet)We Are .NET · 19w  
Source Generators: The Build Performance Killer Nobody Warned You About — Daily DevOps & .NET  
Source generators in .NET run on every single build as part of the Roslyn compilation pipeline, not just once. A typical mid-sized solution can have 8–12 active generators, each executing against the full syntax tree. The key distinction is between the original ISourceGenerator (no caching, full cost every build) and IIncrementalGenerator (introduced in .NET 6, caches unchanged outputs). Many popular NuGet packages still ship non-incremental generators. Multi-targeting multiplies costs per target framework, Hot Reload silently falls back to full rebuilds when generators are involved, and IDE IntelliSense suffers continuous background overhead. Practical guidance covers measuring generator cost via MSBuild binary logs and ReportAnalyzer, checking whether a generator is incremental by inspecting its assembly, and mitigation strategies including emitting/caching generated files, isolating generators to dedicated projects, and conditionally disabling them in Debug builds.  
86
2. 2  
[](https://daily.dev/posts/the-code-you-write-today-is-someone-s-problem-tomorrow-daily-devops-net-2blf5hhmq "The Code You Write Today Is Someone's Problem Tomorrow — Daily DevOps & .NET")  
Article  
![Avatar of wearedotnet](https://media.daily.dev/image/upload/s--BsnVOa3i--/f_auto/v1718347410/logos/wearedotnet)We Are .NET · 17w  
The Code You Write Today Is Someone's Problem Tomorrow — Daily DevOps & .NET  
A reflection on writing code as a long-term legacy, drawing on nearly two decades of .NET production experience. The core argument: carelessness compounds over time, while careful code costs more upfront but less in every future interaction. Concrete .NET examples illustrate the point — CancellationToken propagation, async void pitfalls, Guid.NewGuid() index fragmentation, and nullable reference types. 'Careful' is distinguished from 'perfect': it means understanding operating costs, optimizing for the reader, knowing when good enough suffices, and making implicit assumptions explicit. Practical habits include enabling Roslyn analyzers from day zero, writing a mental summary before each method, treating TODO comments as tracked decisions, and reading diffs before committing.  
49  
7
3. 3  
[](https://daily.dev/posts/react-ui-for-abp-framework-is-finally-here-wy2g6sx9f "React UI for ABP Framework Is Finally Here")  
Article  
![Avatar of wearedotnet](https://media.daily.dev/image/upload/s--BsnVOa3i--/f_auto/v1718347410/logos/wearedotnet)We Are .NET · 19w  
React UI for ABP Framework Is Finally Here  
ABP Framework 10.4.0-rc.1 introduces a long-awaited React UI as a beta/preview option in its modern template system. The implementation includes a Vite-powered React + TypeScript frontend with TanStack Router, TanStack Query, Axios, Zod, React Hook Form, shadcn/ui, Tailwind CSS, and Vitest. The architecture separates the developer's own React app from a pre-built ABP Admin Console (delivered via NuGet) that handles standard module administration pages. The generated app ships with authentication flows, localization, permission-aware routing, API proxy generation, and an optional CRUD sample. It supports layered, single-layer, and microservice templates via the ABP CLI \`--modern\` flag. The design philosophy keeps actual page code inside the project rather than locked in npm packages, enabling full customization and AI-assisted development. General availability is planned for ABP 10.4 stable.  
29  
1
4. 4  
[](https://daily.dev/posts/backgroundservice-exceptions-now-propagate-in-net-11-ra5l0sls3 "BackgroundService exceptions now propagate in .NET 11")  
Article  
![Avatar of wearedotnet](https://media.daily.dev/image/upload/s--BsnVOa3i--/f_auto/v1718347410/logos/wearedotnet)We Are .NET · 18w  
BackgroundService exceptions now propagate in .NET 11  
A four-year-old bug in .NET has been fixed in .NET 11: when a BackgroundService threw an exception after its first await, the host would log a critical error but still exit with code 0, making it appear the process terminated successfully. The root cause was that exceptions thrown after the first await were caught by the hosting infrastructure and triggered a graceful shutdown rather than a failure exit. The fix in PR #124863 makes IHost.RunAsync() and IHost.StopAsync() propagate the BackgroundService exception, resulting in exit code 134 (or 1 on Windows). Developers who prefer the old behavior can opt out by setting BackgroundServiceExceptionBehavior to Ignore.  
26
5. 5  
[](https://daily.dev/posts/stop-pretending-timeprovider-doesn-t-exist-daily-devops-net-8lez0ga1i "Stop Pretending TimeProvider Doesn't Exist — Daily DevOps & .NET")  
Article  
![Avatar of wearedotnet](https://media.daily.dev/image/upload/s--BsnVOa3i--/f_auto/v1718347410/logos/wearedotnet)We Are .NET · 18w  
Stop Pretending TimeProvider Doesn't Exist — Daily DevOps & .NET  
DateTime.UtcNow is a hidden dependency that makes time-sensitive code untestable and causes hard-to-reproduce production bugs. .NET 8 introduced TimeProvider, an official abstraction in the System namespace that replaces ad-hoc IClock patterns. By injecting TimeProvider and using FakeTimeProvider from Microsoft.Extensions.TimeProvider.Testing, developers can freeze and advance time deterministically in tests — no Thread.Sleep, no flaky timing windows. The post covers rewriting token validators, testing retry backoff logic, migrating away from custom IClock interfaces, and a practical step-by-step adoption path for existing codebases. ASP.NET Core's own ISystemClock was deprecated in .NET 8 in favor of TimeProvider, signaling the platform's clear direction.  
21  
1
6. 6  
[](https://daily.dev/posts/should-you-learn-net-c-in-2026-3gqfojdrn "should you learn .NET & C# in 2026")  
Video  
![Avatar of wearedotnet](https://media.daily.dev/image/upload/s--BsnVOa3i--/f_auto/v1718347410/logos/wearedotnet)We Are .NET · 16w  
should you learn .NET & C# in 2026  
A .NET developer with several years of experience argues that learning .NET and C# deeply in 2026 is no longer worth the investment. The core argument is that AI agents (particularly Claude Opus 4.7) are now capable of writing production-quality code in any language, making language-specific expertise increasingly redundant. The author identifies where humans still have an edge: handling large codebases that exceed AI context windows, and coming up with novel architectural solutions. The recommendation is to focus on software architecture, system design, and cloud architecture rather than language-specific proficiency, as the abstraction layer developers work at is shifting from code to natural language instructions.  
25  
6
7. 7  
[](https://daily.dev/posts/when-design-patterns-become-rituals-cnr1hrkja "When Design Patterns Become Rituals")  
Article  
![Avatar of wearedotnet](https://media.daily.dev/image/upload/s--BsnVOa3i--/f_auto/v1718347410/logos/wearedotnet)We Are .NET · 16w  
When Design Patterns Become Rituals  
Design patterns in .NET and ASP.NET Core teams often shift from deliberate solutions to unconscious habits — applied because they feel expected rather than because they solve a real problem. The post examines specific examples: the Repository pattern wrapping EF Core (which is already an abstraction), bloated Service classes with dependency inflation, reflexive interface creation, cargo-culted Factory patterns, and overuse of MediatR. The core argument is that patterns are trade-offs, not inherently good, and teams tend to accept their costs without evaluating whether the benefits apply. The antidote is restoring intentionality — always asking what specific problem a pattern solves before applying it — and trusting that ASP.NET Core's built-in features often provide sufficient structure without additional layering.  
78  
9
8. 8  
[](https://daily.dev/posts/activator-createinstance-vs-compiled-expressions-in-c-net-10-performance-deep-dive-mlorur9rx "Activator.CreateInstance vs Compiled Expressions in C#: .NET 10 Performance Deep Dive")  
Article  
![Avatar of wearedotnet](https://media.daily.dev/image/upload/s--BsnVOa3i--/f_auto/v1718347410/logos/wearedotnet)We Are .NET · 16w  
Activator.CreateInstance vs Compiled Expressions in C#: .NET 10 Performance Deep Dive  
A deep dive into dynamic object instantiation in C# .NET 10, comparing Activator.CreateInstance, ConstructorInfo.Invoke, and compiled expression trees. Covers the internal mechanics of each approach, how to build a thread-safe FuncCache pattern using ConcurrentDictionary, a typed generic variant that avoids boxing, and a BenchmarkDotNet setup to measure real-world performance. Includes a decision table mapping scenarios to the right approach and addresses .NET 10-specific JIT improvements.  
10

[See all We Are .NET archives](/sources/wearedotnet/best-of)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@graph":[{"@type":"CollectionPage","@id":"https://daily.dev/sources/wearedotnet/best-of/2026/05#page","url":"https://daily.dev/sources/wearedotnet/best-of/2026/05","name":"Best We Are .NET Posts — May 2026","description":"The most upvoted We Are .NET posts from May 2026, curated by the daily.dev community.","isPartOf":{"@type":"WebSite","url":"https://daily.dev"}},{"@type":"ItemList","@id":"https://daily.dev/sources/wearedotnet/best-of/2026/05#items","numberOfItems":8,"itemListElement":[{"@type":"ListItem","position":1,"url":"https://daily.dev/posts/source-generators-the-build-performance-killer-nobody-warned-you-about-daily-devops-net-nhr1li6c1","name":"Source Generators: The Build Performance Killer Nobody Warned You About — Daily DevOps & .NET"},{"@type":"ListItem","position":2,"url":"https://daily.dev/posts/the-code-you-write-today-is-someone-s-problem-tomorrow-daily-devops-net-2blf5hhmq","name":"The Code You Write Today Is Someone's Problem Tomorrow — Daily DevOps & .NET"},{"@type":"ListItem","position":3,"url":"https://daily.dev/posts/react-ui-for-abp-framework-is-finally-here-wy2g6sx9f","name":"React UI for ABP Framework Is Finally Here"},{"@type":"ListItem","position":4,"url":"https://daily.dev/posts/backgroundservice-exceptions-now-propagate-in-net-11-ra5l0sls3","name":"BackgroundService exceptions now propagate in .NET 11"},{"@type":"ListItem","position":5,"url":"https://daily.dev/posts/stop-pretending-timeprovider-doesn-t-exist-daily-devops-net-8lez0ga1i","name":"Stop Pretending TimeProvider Doesn't Exist — Daily DevOps & .NET"},{"@type":"ListItem","position":6,"url":"https://daily.dev/posts/should-you-learn-net-c-in-2026-3gqfojdrn","name":"should you learn .NET & C# in 2026"},{"@type":"ListItem","position":7,"url":"https://daily.dev/posts/when-design-patterns-become-rituals-cnr1hrkja","name":"When Design Patterns Become Rituals"},{"@type":"ListItem","position":8,"url":"https://daily.dev/posts/activator-createinstance-vs-compiled-expressions-in-c-net-10-performance-deep-dive-mlorur9rx","name":"Activator.CreateInstance vs Compiled Expressions in C#: .NET 10 Performance Deep Dive"}]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Sources","item":"https://daily.dev/sources"},{"@type":"ListItem","position":3,"name":"We Are .NET","item":"https://daily.dev/sources/wearedotnet"},{"@type":"ListItem","position":4,"name":"Best of","item":"https://daily.dev/sources/wearedotnet/best-of"},{"@type":"ListItem","position":5,"name":"May 2026"}]}]}
```

