<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Chris Woody Woodruff: Blog &amp; Insights</title><description>Chris Woody Woodruff helps teams untangle complexity in software systems: fractional architecture, agentic developer relations, expert witness work, and strategic technology advice.</description><link>https://woodruff.dev/</link><language>en-us</language><item><title>Beyond Boundaries Is Getting a Major Update for .NET 11 and C# 15</title><link>https://woodruff.dev/blog/beyond-boundaries-is-getting-a-major-update-for-net-11-and-c-15/</link><guid isPermaLink="true">https://woodruff.dev/blog/beyond-boundaries-is-getting-a-major-update-for-net-11-and-c-15/</guid><description>When I first published Beyond Boundaries: Networking Programming with C# and .NET, I knew it would need to evolve. Networking doesn’t stand still, and neither does the .NET platform. What I didn’t…</description><pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate><category>network-programming</category><category>net</category><category>c</category><category>dotnet</category><category>network</category><category>programming</category></item><item><title>The N+1 Query Problem in EF Core: Detection, Diagnosis, and Permanent Fixes</title><link>https://woodruff.dev/blog/the-n1-query-problem-in-ef-core/</link><guid isPermaLink="true">https://woodruff.dev/blog/the-n1-query-problem-in-ef-core/</guid><description>An order summary page renders in 40 milliseconds against your development database. The same page takes eleven seconds in production. You open the profiler, and the controller method looks clean. You…</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>data</category><category>databases</category><category>dotnet</category><category>entity-framework-core</category><category>programming</category></item><item><title>Add vs AddRange in EF Core: The Performance Myth You Need to Stop Repeating</title><link>https://woodruff.dev/blog/add-vs-addrange-in-ef-core-the-performance-myth-you-need-to-stop-repeating/</link><guid isPermaLink="true">https://woodruff.dev/blog/add-vs-addrange-in-ef-core-the-performance-myth-you-need-to-stop-repeating/</guid><description>Somebody told you never to call Add() in a loop. Maybe it was a senior developer during code review. Maybe it was a Stack Overflow answer with four hundred upvotes. Maybe it was a blog post that…</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>data</category><category>databases</category><category>dotnet</category><category>entity-framework-core</category><category>programming</category></item><item><title>5 EF Core Performance Anti-Patterns That Entity Framework Extensions Eliminates</title><link>https://woodruff.dev/blog/5-ef-core-performance-anti-patterns-that-entity-framework-extensions-eliminates/</link><guid isPermaLink="true">https://woodruff.dev/blog/5-ef-core-performance-anti-patterns-that-entity-framework-extensions-eliminates/</guid><description>The Code You Already Wrote Every .NET team has at least one of these in production. It looked fine in review. It passed unit tests. It worked in staging against the seed data. Then real traffic hit…</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>data</category><category>databases</category><category>dotnet</category><category>entity-framework-core</category><category>programming</category></item><item><title>BulkSynchronize in EF Core: Mirror Your Data in One Operation</title><link>https://woodruff.dev/blog/bulksynchronize-in-ef-core-mirror-your-data-in-one-operation/</link><guid isPermaLink="true">https://woodruff.dev/blog/bulksynchronize-in-ef-core-mirror-your-data-in-one-operation/</guid><description>The Function Everyone Has Written, Nobody Loves If your codebase has a method called something like SyncProducts(), RefreshMetrics(), or UpdateFromFeed(), it probably looks something like this: It…</description><pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>data</category><category>databases</category><category>dotnet</category><category>entity-framework-core</category><category>programming</category></item><item><title>Scaling EF Core for Data Imports: From CSV Files to Millions of Database Rows</title><link>https://woodruff.dev/blog/scaling-ef-core-for-data-imports/</link><guid isPermaLink="true">https://woodruff.dev/blog/scaling-ef-core-for-data-imports/</guid><description>The Import Job Nobody Wants to Own Every team has one. It might be called an import service, a feed processor, or a sync job. The name varies. What stays constant is the shape of the problem: a large…</description><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>data</category><category>databases</category><category>dotnet</category><category>entity-framework-core</category><category>programming</category></item><item><title>BulkMerge (Upsert) in EF Core: How to Insert-or-Update Without the Headache</title><link>https://woodruff.dev/blog/bulkmerge-upsert-in-ef-core-how-to-insert-or-update-without-the-headache/</link><guid isPermaLink="true">https://woodruff.dev/blog/bulkmerge-upsert-in-ef-core-how-to-insert-or-update-without-the-headache/</guid><description>Picture this. Your inbox lights up at 7:14 AM. A supplier just pushed 50,000 product records to your endpoint. Half are new. The other half are updates to products already sitting in your database.…</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>data</category><category>databases</category><category>dotnet</category><category>entity-framework-core</category><category>programming</category></item><item><title>New Release!! htmxRazor v2.1.0: Advanced Inputs</title><link>https://woodruff.dev/blog/new-release-htmxrazor-v2-1-0-advanced-inputs/</link><guid isPermaLink="true">https://woodruff.dev/blog/new-release-htmxrazor-v2-1-0-advanced-inputs/</guid><description>Forms are where server-rendered apps either feel sharp or feel clunky. A date field that drops you into a raw text box, a category selector that needs a client-side widget and three npm packages, a…</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>htmx</category><category>net</category><category>asp-net-core</category><category>c</category><category>dotnet</category><category>htmx</category><category>htmxrazor</category><category>programming</category></item><item><title>Pagination in EF Core, Continued: Sortable Grids, htmx, and the Indexing Cost</title><link>https://woodruff.dev/blog/pagination-in-ef-core-continued-sortable-grids-htmx-and-the-indexing-cost/</link><guid isPermaLink="true">https://woodruff.dev/blog/pagination-in-ef-core-continued-sortable-grids-htmx-and-the-indexing-cost/</guid><description>The first post in this series made a clean case for keyset pagination over Skip/Take. Readers on LinkedIn pushed back with a fair question I’d dodged: what about sortable grids where the user picks…</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>data</category><category>databases</category><category>dotnet</category><category>entity-framework-core</category><category>programming</category></item><item><title>Pagination in Entity Framework Core: Why Skip/Take Falls Apart on Hot Tables</title><link>https://woodruff.dev/blog/pagination-in-entity-framework-core-why-skip-take-falls-apart-on-hot-tables/</link><guid isPermaLink="true">https://woodruff.dev/blog/pagination-in-entity-framework-core-why-skip-take-falls-apart-on-hot-tables/</guid><description>If you’ve built an ASP.NET Core API or list view backed by Entity Framework Core, you’ve almost certainly written something like this: It works. It matches the page-number UI most users expect. Every…</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>data</category><category>databases</category><category>dotnet</category><category>entity-framework-core</category><category>programming</category></item><item><title>EF Core Bulk Insert: The Complete Guide to Inserting Thousands of Rows Without the Wait</title><link>https://woodruff.dev/blog/ef-core-bulk-insert-the-complete-guide-to-inserting-thousands-of-rows-without-the-wait/</link><guid isPermaLink="true">https://woodruff.dev/blog/ef-core-bulk-insert-the-complete-guide-to-inserting-thousands-of-rows-without-the-wait/</guid><description>This post is sponsored by ZZZ Projects. You have written this loop. Every .NET developer has. It looks fine in a code review. It passes unit tests. It works against your local database with 200…</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>data</category><category>databases</category><category>dotnet</category><category>entity-framework-core</category><category>programming</category></item><item><title>The Strategic Case for “Use What Works”: Why Smart Tech Leaders Stop Reinventing the Wheel</title><link>https://woodruff.dev/blog/the-strategic-case-for-use-what-works-why-smart-tech-leaders-stop-reinventing-the-wheel/</link><guid isPermaLink="true">https://woodruff.dev/blog/the-strategic-case-for-use-what-works-why-smart-tech-leaders-stop-reinventing-the-wheel/</guid><description>A peculiar kind of pride runs through the technology industry. Many leaders believe their problems are unique, their scale unprecedented, their requirements so specific that only a custom-built…</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><category>biz-software</category><category>business-of-software</category></item><item><title>ReSharper Made VS Code a Real Option for My .NET Work</title><link>https://woodruff.dev/blog/resharper-made-vs-code-a-real-option-for-my-net-work/</link><guid isPermaLink="true">https://woodruff.dev/blog/resharper-made-vs-code-a-real-option-for-my-net-work/</guid><description>Most posts about ReSharper for VS Code want to convert you. This one doesn’t. I write most of my .NET in Rider. I’m not moving. What changed for me back in March 2026, when JetBrains shipped the…</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><category>developer-experience</category><category>net</category><category>c</category><category>dotnet</category><category>ides</category><category>programming</category></item><item><title>htmxRazor v2.0.0: Platform and DX</title><link>https://woodruff.dev/blog/htmxrazor-v2-0-0-platform-and-dx/</link><guid isPermaLink="true">https://woodruff.dev/blog/htmxrazor-v2-0-0-platform-and-dx/</guid><description>An interactive playground, a live theme builder, SignalR, and a Kanban board, all on .NET 10 with no breaking changes. htmxRazor v2.0.0 is out today. The six features in this release span three…</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><category>htmx</category><category>net</category><category>asp-net-core</category><category>c</category><category>dotnet</category><category>htmx</category><category>htmxrazor</category><category>programming</category></item><item><title>How to Delete and Update Millions of Rows in EF Core Without Loading a Single Entity</title><link>https://woodruff.dev/blog/how-to-delete-and-update-millions-of-rows-in-ef-core-without-loading-a-single-entity/</link><guid isPermaLink="true">https://woodruff.dev/blog/how-to-delete-and-update-millions-of-rows-in-ef-core-without-loading-a-single-entity/</guid><description>This post is sponsored by ZZZ Projects. The Code Every Developer Has Written and Regretted Most EF Core performance disasters are not exotic edge cases. They get written in the first sprint, look…</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>data</category><category>databases</category><category>dotnet</category><category>ef-core</category><category>programming</category></item><item><title>htmxRazor v1.4.0: SSE Streaming, Multi-step Wizard, and Optimistic UI</title><link>https://woodruff.dev/blog/htmxrazor-v1-4-0-sse-streaming-multi-step-wizard-and-optimistic-ui/</link><guid isPermaLink="true">https://woodruff.dev/blog/htmxrazor-v1-4-0-sse-streaming-multi-step-wizard-and-optimistic-ui/</guid><description>v1.4.0 ships today with seven features built around a single theme: the interaction patterns real production applications actually need. Real-time content streaming, multi-step workflows, immediate…</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><category>htmx</category><category>net</category><category>asp-net-core</category><category>c</category><category>dotnet</category><category>htmx</category><category>htmxrazor</category><category>programming</category></item><item><title>htmxRazor v1.3.0: Data Table, Accessibility, and Modern CSS</title><link>https://woodruff.dev/blog/htmxrazor-v1-3-0-data-table-accessibility-and-modern-css/</link><guid isPermaLink="true">https://woodruff.dev/blog/htmxrazor-v1-3-0-data-table-accessibility-and-modern-css/</guid><description>v1.3.0 lands today with six features organized around a clear theme: production patterns for .NET developers building server-rendered UIs that work correctly for everyone, including keyboard users…</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><category>htmx</category><category>net</category><category>asp-net-core</category><category>c</category><category>dotnet</category><category>programming</category></item><item><title>htmxRazor 1.2.0: Toast Notifications, Pagination, and the End of CSS Specificity Fights</title><link>https://woodruff.dev/blog/htmxrazor-1-2-0-toast-notifications-pagination-and-the-end-of-css-specificity-fights/</link><guid isPermaLink="true">https://woodruff.dev/blog/htmxrazor-1-2-0-toast-notifications-pagination-and-the-end-of-css-specificity-fights/</guid><description>The first feature release after htmxRazor hit 1.1 is here, and it targets the three complaints I hear most from .NET developers building server-rendered apps with htmx: “I need toast notifications,”…</description><pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate><category>htmx</category><category>net</category><category>c</category><category>dotnet</category><category>htmxrazor</category><category>programming</category><category>ux</category><category>wed-components</category></item><item><title>Fencing Tokens and Generation Clock in .NET: Stop Zombie Leaders From Writing</title><link>https://woodruff.dev/blog/fencing-tokens-and-generation-clock-in-net-stop-zombie-leaders-from-writing/</link><guid isPermaLink="true">https://woodruff.dev/blog/fencing-tokens-and-generation-clock-in-net-stop-zombie-leaders-from-writing/</guid><description>Leader election and leases answer a comforting question: who should be in charge right now. They do not fully answer the dangerous question: who can still write right now. A node can lose its lease…</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>distributed</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Stop Wrestling with JavaScript: htmxRazor Gives ASP.NET Core the Component Library It Deserves</title><link>https://woodruff.dev/blog/stop-wrestling-with-javascript-htmxrazor-gives-asp-net-core-the-component-library-it-deserves/</link><guid isPermaLink="true">https://woodruff.dev/blog/stop-wrestling-with-javascript-htmxrazor-gives-asp-net-core-the-component-library-it-deserves/</guid><description>Here is an uncomfortable truth the ASP.NET Core community has been avoiding for too long: server-rendered web development should not require you to adopt React, Vue, or Angular just to get a decent…</description><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><category>htmx</category><category>net</category><category>asp-net-core</category><category>c</category><category>dotnet</category><category>programming</category><category>web-development</category></item><item><title>Lease Pattern in .NET: A Lock With an Expiration Date That Saves Your Data</title><link>https://woodruff.dev/blog/lease-pattern-in-net-a-lock-with-an-expiration-date-that-saves-your-data/</link><guid isPermaLink="true">https://woodruff.dev/blog/lease-pattern-in-net-a-lock-with-an-expiration-date-that-saves-your-data/</guid><description>Indefinite locks belong to a world where processes never crash and networks never split. That world does not exist. In a distributed system, “I hold the lock” can mean “I held the lock before my VM paused for 45 seconds.” A lease fixes that by putting a deadline on ownership and forcing the owner…</description><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>distributed</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Leader Election in .NET: Picking One Boss Without Creating Two</title><link>https://woodruff.dev/blog/leader-election-in-net-picking-one-boss-without-creating-two/</link><guid isPermaLink="true">https://woodruff.dev/blog/leader-election-in-net-picking-one-boss-without-creating-two/</guid><description>If your service runs on more than one node and still has a single instance assumption, you already have leader election. You just do not have it on purpose. Leader election is the pattern that turns “somebody should run this” into “exactly one node is allowed to run this, and it must keep proving…</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>distributed</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Distributed System Pattern: Leader and Followers in .NET - One Decision Maker, Many Replicas, Fewer Outages</title><link>https://woodruff.dev/blog/distributed-system-pattern-leader-and-followers-in-net-one-decision-maker-many-replicas-fewer-outages/</link><guid isPermaLink="true">https://woodruff.dev/blog/distributed-system-pattern-leader-and-followers-in-net-one-decision-maker-many-replicas-fewer-outages/</guid><description>Distributed systems rarely fail because you picked the wrong cloud service. They fail because two nodes believe they are in charge, both act, and both are “correct” from their own perspective. If your domain has any single authority assumption, and most systems do, you need a way to make that…</description><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>distributed</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Patterns of Distributed Systems in C# and .NET: A New Series for People Who Ship Real Systems</title><link>https://woodruff.dev/blog/patterns-of-distributed-systems-in-c-and-net-a-new-series-for-people-who-ship-real-systems/</link><guid isPermaLink="true">https://woodruff.dev/blog/patterns-of-distributed-systems-in-c-and-net-a-new-series-for-people-who-ship-real-systems/</guid><description>Distributed systems do not fail because you missed a feature. They fail because responsibility is unclear. Two nodes act, both think they are right, and your data becomes a debate. This series is my pushback against cargo cult architecture. We are going to talk about the small, repeatable…</description><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>distributed</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Systems Thinking Meets Simplicity-First: A Decision Framework for Software Architects</title><link>https://woodruff.dev/blog/systems-thinking-meets-simplicity-first-a-decision-framework-for-software-architects/</link><guid isPermaLink="true">https://woodruff.dev/blog/systems-thinking-meets-simplicity-first-a-decision-framework-for-software-architects/</guid><description>Modern technology operates in a paradox. Our tools have never been more powerful, yet our systems have never felt more fragile. Every framework, pipeline, and process claims to simplify development, but most end up multiplying dependencies and eroding clarity. In that chaos, two guiding…</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><category>simplicity-first</category><category>architecture</category><category>design</category><category>simplicity-first</category><category>systems-thinking</category></item><item><title>Enterprise Patterns for ASP.NET Core Minimal API: Data Transfer Object Pattern</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-data-transfer-object-pattern/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-data-transfer-object-pattern/</guid><description>Your domain model exists to protect your business rules. Your API exists to protect your clients. When you expose EF Core entities directly from your ASP.NET Core endpoints, you throw both of those protections away. The Data Transfer Object Pattern (DTO) is the line in the sand. DTOs carry data…</description><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate><category>patterns</category></item><item><title>Stop Building SPAs for Every Screen: htmx + ASP.NET Core Razor Pages Workshop (Open)</title><link>https://woodruff.dev/blog/stop-building-spas-for-every-screen-htmx-asp-net-core-razor-pages-workshop-open/</link><guid isPermaLink="true">https://woodruff.dev/blog/stop-building-spas-for-every-screen-htmx-asp-net-core-razor-pages-workshop-open/</guid><description>If your default move for “modern UX” is a SPA, you are paying a tax you do not need. You pay for it in build pipelines, duplicated validation rules, fragile client state, and a front end that turns routine CRUD into an engineering project. This workshop is a different bet. We keep the server in…</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><category>htmx</category><category>net</category><category>asp-net-core</category><category>c</category><category>dotnet</category><category>htmx</category><category>programming</category></item><item><title>Enterprise Patterns for ASP.NET Core: Front Controller and MVC Pattern</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-front-controller-and-mvc-pattern/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-front-controller-and-mvc-pattern/</guid><description>If every controller in your system does its own authentication, logging, and error handling, you do not have an architecture. You have a crowd of small frameworks pretending to cooperate. Front Controller and MVC are the patterns that push back against that drift. - Front Controllers decide what…</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Enterprise Patterns for ASP.NET Core Minimal API: Lazy Load Pattern</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-lazy-load-pattern/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-lazy-load-pattern/</guid><description>If a single endpoint pulls half your database just to render a small card on a mobile screen, your problem is not the database. Your problem is that you are afraid to say no. Lazy Load is how you say no. You refuse to pay for the cost of related data until it&apos;s actually needed. Used with intent, it…</description><pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Enterprise Patterns for ASP.NET Core Minimal API: Identity Map Pattern</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-identity-map-pattern/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-identity-map-pattern/</guid><description>If one customer quietly turns into three different in-memory objects during a single request, your domain is already lying to you. You see it when: - Different parts of a request each load the same row again - One instance is updated, another is validated, and a third is saved - Bugs show up as…</description><pubDate>Tue, 06 Jan 2026 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Enterprise Patterns for ASP.NET Core Minimal API: Unit of Work Pattern</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-unit-of-work-pattern/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-unit-of-work-pattern/</guid><description>If a single business operation calls SaveChangesAsync three times, you do not have a transaction. You have a sequence of partial commits that you hope never fails in the middle. Think about a typical “Place Order” flow: - Create an order - Reserve inventory - Update customer credit - Write an audit…</description><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Enterprise Patterns for ASP.NET Core Minimal API: Repository Pattern</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-repository-pattern/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-repository-pattern/</guid><description>If DbContext shows up in every corner of your codebase, you do not have a domain model. You have a thin layer of LINQ wrapped in HTTP. You see it when: - Minimal API endpoints inject AppDbContext and write queries inline - Domain services take DbContext instead of domain interfaces - Every feature…</description><pubDate>Mon, 29 Dec 2025 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Enterprise Patterns for ASP.NET Core Minimal API: Data Mapper Pattern</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-data-mapper-pattern/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-data-mapper-pattern/</guid><description>If every interesting class in your system secretly knows a connection string, your domain is not a model. It is a thin layer of code on top of a data access layer. You see it when: - Domain classes inject DbContext directly - Entities call SaveChanges on their own - Simple rule tests require poking…</description><pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Enterprise Patterns for ASP.NET Core Minimal API: Active Record Pattern</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-active-record-pattern/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-active-record-pattern/</guid><description>Sometimes, your domain is really just rows in a table. You have a Customers table with Id, Email, and CreditLimit. You load a row, tweak a field, and write it back. That is the whole story. In that situation, introducing a complete Domain Model, Data Mapper, and Repository stack can feel like…</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Debugging Entity Framework Core: 8 Real-World Query Anti‑Patterns (and How to Fix Them)</title><link>https://woodruff.dev/blog/debugging-entity-framework-core-8-real-world-query-anti-patterns-and-how-to-fix-them/</link><guid isPermaLink="true">https://woodruff.dev/blog/debugging-entity-framework-core-8-real-world-query-anti-patterns-and-how-to-fix-them/</guid><description>This is my post for the 2025 C Advent. Check out all the great posts! I want to wish you a Merry Christmas, Happy Holidays, Happy Hanukkah, Happy Kwanzaa, and, finally, Happy Festivus. I will not be sharing my &quot;Airing of grievances&quot; or challenge anyone to a &quot;Feats of strength.&quot; Entity Framework…</description><pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate><category>efcore</category><category>net</category><category>c</category><category>databases</category><category>dotnet</category><category>entity-framework-core</category><category>mssql</category><category>programming</category></item><item><title>Enterprise Patterns for ASP.NET Core Minimal API: Service Layer Pattern - Making HTTP a Client, Not the Boss</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-service-layer-pattern-making-http-a-client-not-the-boss/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-service-layer-pattern-making-http-a-client-not-the-boss/</guid><description>Open a typical ASP.NET Core project, and you will often see the same shape: - Controllers that validate input, construct entities and call several repositories - Direct calls to external services (payments, credit, email) from controller actions - Transactions managed in random places with…</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Enterprise Patterns for ASP.NET Core Minimal API: Domain Model Pattern - When Your Core Rules Deserve Their Own Gravity</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-domain-model-pattern-when-your-core-rules-deserve-their-own-gravity/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-domain-model-pattern-when-your-core-rules-deserve-their-own-gravity/</guid><description>Look at a typical enterprise ASP.NET Core application, and you often see the same pattern: - Controllers validating requests, calculating totals, and applying discounts - EF Core entities that are little more than property bags - Stored procedures that quietly decide which orders are valid If you…</description><pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Enterprise Patterns for ASP.NET Core Minimal API: Transaction Script Pattern - The Shortcut That Quietly Reshapes Your System</title><link>https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-transaction-script-pattern-the-shortcut-that-quietly-reshapes-your-system/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-for-asp-net-core-minimal-api-transaction-script-pattern-the-shortcut-that-quietly-reshapes-your-system/</guid><description>Picture this. Product wants a minor discount tweak: if an order total is below 100, no discount. You open an endpoint, add a conditional, save and push. Ten minutes, job done. Three months later, that simple rule exists in six different endpoints, each with its own tiny twist. Someone fixes a bug…</description><pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Enterprise Patterns, Real Code: Implementing Fowler’s Ideas in C#</title><link>https://woodruff.dev/blog/enterprise-patterns-real-code-implementing-fowlers-ideas-in-c/</link><guid isPermaLink="true">https://woodruff.dev/blog/enterprise-patterns-real-code-implementing-fowlers-ideas-in-c/</guid><description>Most enterprise systems already use patterns from Martin Fowler’s Patterns of Enterprise Application Architecture. The twist is that many teams use them without naming them, half implement them and then wonder why the codebase fights back. If your ASP.NET solution contains controllers that talk…</description><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Stop Letting Your Controllers Talk to SQL: Layered Architecture in ASP.NET Core</title><link>https://woodruff.dev/blog/stop-letting-your-controllers-talk-to-sql-layered-architecture-in-asp-net-core/</link><guid isPermaLink="true">https://woodruff.dev/blog/stop-letting-your-controllers-talk-to-sql-layered-architecture-in-asp-net-core/</guid><description>Walk into almost any long-lived enterprise codebase, and you will find the same pattern: - Controllers that know about routing, JSON, SQL, and domain rules - Repositories that reach up into HttpContext - Business rules scattered across UI, stored procedures, and helper classes At that point, adding…</description><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate><category>patterns</category><category>net</category><category>c</category><category>dotnet</category><category>patterns</category><category>programming</category></item><item><title>Licensing Compliance in the Courtroom: Why It Matters More Than You Think</title><link>https://woodruff.dev/blog/licensing-compliance-in-the-courtroom-why-it-matters-more-than-you-think/</link><guid isPermaLink="true">https://woodruff.dev/blog/licensing-compliance-in-the-courtroom-why-it-matters-more-than-you-think/</guid><description>In nearly every industry, open-source code fuels innovation. Developers harness open libraries, frameworks, and tools to accelerate features and cut costs. Yet, in this race for speed, many teams overlook a vital element: licensing. Each open-source component carries specific terms that guide its…</description><pubDate>Fri, 17 Oct 2025 00:00:00 GMT</pubDate><category>biz-software</category><category>business-of-software</category><category>law</category><category>licensing</category><category>open-source</category></item><item><title>Secure Application Development Starts With Architecture</title><link>https://woodruff.dev/blog/secure-application-development-starts-with-architecture/</link><guid isPermaLink="true">https://woodruff.dev/blog/secure-application-development-starts-with-architecture/</guid><description>Most organizations still treat application security as part of the endgame. They build, test, and deploy first, then scramble to patch vulnerabilities discovered too late. This approach creates a false sense of control. Security cannot simply be bolted onto a finished product. It is not a feature…</description><pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate><category>biz-software</category><category>business-of-software</category></item><item><title>Make Your GitHub Profile Update Itself (WordPress posts, GitHub releases, LinkedIn newsletters)</title><link>https://woodruff.dev/blog/make-your-github-profile-update-itself-wordpress-posts-github-releases-linkedin-newsletters/</link><guid isPermaLink="true">https://woodruff.dev/blog/make-your-github-profile-update-itself-wordpress-posts-github-releases-linkedin-newsletters/</guid><description>Want your GitHub profile to look alive without spending your weekends copy-pasting links? Let’s wire it to your actual work: blog posts from WordPress, newly published releases, and your newsletter issues. You will get a profile that quietly refreshes itself on a schedule and on events. We will…</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><category>blog</category><category>fun-tech</category><category>github</category><category>python</category><category>scripting</category></item><item><title>Bridging the Gap Between Software Engineering and Business Goals</title><link>https://woodruff.dev/blog/bridging-the-gap-between-software-engineering-and-business-goals/</link><guid isPermaLink="true">https://woodruff.dev/blog/bridging-the-gap-between-software-engineering-and-business-goals/</guid><description>Many organizations underestimate the importance of incorporating security from the very beginning, viewing it as an accessory instead of a core feature. This mindset can weaken foundations and allow vulnerabilities to take root once the system is operational, making remediation far more costly and…</description><pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate><category>biz-software</category><category>business-of-software</category></item><item><title>Software Quality Assessment as an Ongoing Practice, Not a One-Time Event</title><link>https://woodruff.dev/blog/software-quality-assessment-as-an-ongoing-practice-not-a-one-time-event/</link><guid isPermaLink="true">https://woodruff.dev/blog/software-quality-assessment-as-an-ongoing-practice-not-a-one-time-event/</guid><description>Many organizations still think of quality as something to verify at the end of a project. The testing phase becomes a ritual where checklists are completed, signatures are collected, and the release is declared ready. This approach reduces quality to a formality rather than a discipline. It treats…</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><category>biz-software</category><category>business-of-software</category></item><item><title>The Hidden ROI of Technical Due Diligence in Software Investments</title><link>https://woodruff.dev/blog/the-hidden-roi-of-technical-due-diligence-in-software-investments/</link><guid isPermaLink="true">https://woodruff.dev/blog/the-hidden-roi-of-technical-due-diligence-in-software-investments/</guid><description>When investors assess a company, the starting point is often its financial performance. Key indicators like revenue growth, profitability, and market share are crucial in shaping their investment decisions. However, for technology-driven businesses, the real determinant of value is the robustness…</description><pubDate>Mon, 29 Sep 2025 00:00:00 GMT</pubDate><category>biz-software</category><category>business-of-software</category></item><item><title>Bringing Simplicity-First to the Page: My Upcoming Book</title><link>https://woodruff.dev/blog/bringing-simplicity-first-to-the-page-my-upcoming-book/</link><guid isPermaLink="true">https://woodruff.dev/blog/bringing-simplicity-first-to-the-page-my-upcoming-book/</guid><description>I am excited to share some big news. In the second half of 2026, my new book, titled Software Architecture Made Simple: A &apos;Simplicity-First&apos; Approach to Software in the Age of Complexity, will be released. This book compiles years of blog articles, newsletters, and social media posts, consolidating…</description><pubDate>Sat, 27 Sep 2025 00:00:00 GMT</pubDate><category>simplicity-first</category><category>net</category><category>ai</category><category>architecture</category><category>business-of-software</category><category>c</category><category>dotnet</category><category>programming</category></item><item><title>System Modernization Without the Burnout: Lessons from Distributed Systems</title><link>https://woodruff.dev/blog/system-modernization-without-the-burnout-lessons-from-distributed-systems/</link><guid isPermaLink="true">https://woodruff.dev/blog/system-modernization-without-the-burnout-lessons-from-distributed-systems/</guid><description>Every developer has heard the horror story: the company that decided to throw away its legacy system and rewrite everything from scratch in one giant project. Months turn into years, budgets double, teams burn out, and in the end, the “new” system often launches missing key functionality, or worse…</description><pubDate>Fri, 26 Sep 2025 00:00:00 GMT</pubDate><category>biz-software</category><category>business-of-software</category></item><item><title>Why Fractional Architecture is the Future of Technology Strategy</title><link>https://woodruff.dev/blog/why-fractional-architecture-is-the-future-of-technology-strategy/</link><guid isPermaLink="true">https://woodruff.dev/blog/why-fractional-architecture-is-the-future-of-technology-strategy/</guid><description>For years, software architecture has carried an aura of exclusivity, something reserved for Fortune 500 companies with expansive IT budgets and dedicated teams focused on enterprise systems. Smaller and mid-sized organizations often believed they didn’t need architects, or worse, that architecture…</description><pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate><category>biz-software</category><category>architecture</category><category>business-of-software</category></item><item><title>Day 35: Evolution Beyond Biology: Using Genetic Algorithms for Creative Art and Design</title><link>https://woodruff.dev/blog/day-35-evolution-beyond-biology-using-genetic-algorithms-for-creative-art-and-design/</link><guid isPermaLink="true">https://woodruff.dev/blog/day-35-evolution-beyond-biology-using-genetic-algorithms-for-creative-art-and-design/</guid><description>Genetic Algorithms are often associated with engineering, scheduling, or optimization problems, but their potential extends into the domain of art and design. When applied to visual composition, generative structures, or music synthesis, GAs can produce unexpected and compelling outcomes. These…</description><pubDate>Thu, 18 Sep 2025 00:00:00 GMT</pubDate><category>genetic-algorithms</category><category>net</category><category>ai</category><category>c</category><category>dotnet</category><category>genetic-algorithms</category><category>programming</category></item></channel></rss>