The Scoped?Singleton DI Bug Your AI Just Suggested — Cursor Blog | Neura Market
    Neura MarketNeura Market/Cursor
    ChatGPTChatGPTClaudeClaudeGeminiGeminiCursorCursorGrokGrokPerplexityPerplexityDeepSeekDeepSeek
    CoPilotCoPilotStable DiffusionStable DiffusionMidjourneyMidjourney
    View All Directories
    OverviewRulesPromptsMCPsAgentsBlogVideosGuidesCoursesCommunityExtensionsTrendingGenerate
    CursorBlogThe Scoped?Singleton DI Bug Your AI Just Suggested
    Back to Blog
    The Scoped?Singleton DI Bug Your AI Just Suggested
    csharp

    The Scoped?Singleton DI Bug Your AI Just Suggested

    Agentic Architect May 21, 2026
    0 views

    The .NET dependency-injection lifetime bug that ships to production silently. Why AI assistants suggest it. And the one Cursor rule that catches it before merge.

    The Scoped?Singleton DI bug your AI just suggested (and how to catch it) Of all the bugs that ship to production silently, the captured-dependency lifetime bug is one of the most expensive. It compiles. It passes your tests. It runs fine in dev. Then in production, under load, it starts corrupting data across requests. And AI assistants suggest it constantly. I'll walk through why, and the one Cursor rule that catches it before merge. ## The bug, in 30 lines `` You ask Cursor to add caching to OrderService. It gives you this: ```plaintext ``` // OrderService.cs public class OrderService : IOrderService { private readonly IMemoryCache _cache; private readonly OrderDbContext _db; public OrderService(IMemoryCache cache, OrderDbContext db) { _cache = cache; _db = db; } public async Task<Order?> GetAsync(int id, CancellationToken ct) { if (_cache.TryGetValue(id, out Order? cached)) return cached; var order = await _db.Orders.FindAsync(new object[] { id }, ct); if (order is not null) _cache.Set(id, order, TimeSpan.FromMinutes(5)); return order; } } // Program.cs builder.Services.AddDbContext<OrderDbContext>(...); builder.Services.AddScoped<IOrderService, OrderService>(); builder.Services.AddMemoryCache(); // ? registers IMemoryCache as Singleton Looks correct. Compiles. Tests pass. Shipped. ## What actually happens at runtime ``****``**** IMemoryCache is registered as Singleton, one instance for the entire app's lifetime. OrderService is registered as Scoped, one instance per HTTP request. ````plaintext On its own, that's fine. The problem is what you cached: an Order entity, which is in turn attached to OrderDbContext, also Scoped. The cache, alive for the lifetime of the application, now holds a reference to an entity attached to a DbContext that was disposed when the original request ended. `` Now request #2 comes in. It hits the cache, gets the order, mutates a property. Then request #3 hits the cache, sees the mutation, and decides to write something else based on it. Then request #4 wakes up the entity's dispose-tracking and explodes with ObjectDisposedException, but only sometimes, depending on the GC pressure that day. Welcome to the longest debugging session of your year. ## Why AI assistants suggest this constantly The patterns the AI has seen most often in its training data, short examples, blog tutorials, StackOverflow answers, almost always omit DI registration. A typical "caching with IMemoryCache" snippet looks like ten lines, with no reference to where the service is registered or with what lifetime. ****** The AI learned the surface pattern ("inject IMemoryCache, call .Set") without the surrounding constraint ("…unless the consumer is Scoped and the cached value graph reaches into Scoped infrastructure"). When you ask it to add caching to your codebase, it pattern-matches against the surface form. The constraint is invisible to it. **** This isn't a "the AI is dumb" critique. Most senior developers ship this exact bug at least once. The patterns in the wild teach the wrong lesson. ## The five lifetime traps to teach the AI If you're going to enforce one set of rules on AI-suggested .NET code, make it these: ### 1. Scoped or Transient injected into Singleton `` The classic. A Singleton constructor takes IRepository<T> (Scoped). The Singleton captures it forever. Requests share state. Data corrupts. **** The rule: when adding a constructor parameter, check the parameter type's registered lifetime. If the consumer is Singleton and the parameter is Scoped/Transient, refuse and surface the issue. ### 2. DbContext captured by anything Singleton ``****`` Special case of #1 but worth its own callout. DbContext is always Scoped, it has to be, it tracks per-request state. Any Singleton that captures a DbContext is a bug. If you need DB access from a Singleton, inject IServiceScopeFactory and create a scope per operation. ### 3. Cached entities still attached to a DbContext The bug from the example. The cache outlives the DbContext, but holds a graph that depends on it. ****`` The rule: what goes into long-lived caches must be either (a) AsNoTracking()'d, (b) projected to a DTO, or (c) detached explicitly. ### ```` 4. HttpClient instantiated with new ```` A long-running app that does new HttpClient() on every call leaks sockets, eventually exhausting the connection pool. Even worse: a Singleton that captures a single HttpClient reuses DNS forever. ****`````` The rule: always inject IHttpClientFactory and call CreateClient(name). Never new HttpClient() outside of one-shot scripts. ### 5. Hosted services touching Scoped dependencies directly `` IHostedService is Singleton-by-construction. Inject a Scoped repo into one and it'll be alive for the lifetime of the process, every "scoped" operation will share state. Worse, the DbContext will leak. ****`````` The rule: in any BackgroundService or IHostedService, never inject Scoped dependencies directly. Inject IServiceScopeFactory and create a scope per unit of work. ## The Cursor rule that catches all five ``[](https://agenticstandardcontact-byte.github.io/agentic-architect/)`````` The dotnet-di.mdc rule in Agentic Architect codifies the above. When Cursor is editing a file where DI is happening, Program.cs, Startup.cs, ServiceCollectionExtensions.cs, any class constructor, the rule activates and audits suggestions for: - Lifetime mismatches between consumer and constructor parameters - Captured Scoped dependencies inside hosted services or background workers - ``Direct HttpClient instantiation - Captured tracked entities in long-lived caches - Static helpers reaching into scoped infrastructure ** The trick is the scoping: it loads only on files where DI is actually happening, not on every prompt. Your token budget stays sane. The AI stays sharp on the file you're actually in. ## The bigger pattern: enforce, don't suggest ******** The reframe that took me a year of using AI assistants to internalize is this: generic prompts ask the AI to suggest good patterns. Scoped rules force it to enforce them. "Be careful with DI lifetimes" is a suggestion. The AI will agree, nod sagely, then ship the captured-Scoped bug an hour later when you're tired. "Before suggesting any constructor change, audit the lifetime contract" is a rule. The AI now has a checklist. It pauses, runs the check, and either suggests a boundary-respecting alternative or asks you a targeted question, instead of confidently shipping the bug. ** The first time the AI catches a Scoped-into-Singleton in code you wrote, the kit pays for itself. ## Keep reading - [](https://agenticstandardcontact-byte.github.io/agentic-architect/blog/04-cursor-result-not-throw.html)Result<T> instead of throw - [](https://agenticstandardcontact-byte.github.io/agentic-architect/blog/03-cursor-hallucination-loop-breaker.html)Hallucination loop breaker [](https://agenticstandardcontact-byte.github.io/agentic-architect/)[](https://agenticstandardcontact-byte.github.io/agentic-architect/hardware/) Kit: Agentic Architect · Local models: Hardware hub --- **Free starter (3 Cursor rules):** [https://agenticstandardcontact-byte.github.io/agentic-architect/#free-kit-signup](https://agenticstandardcontact-byte.github.io/agentic-architect/#free-kit-signup) **Full kit (£9, one-time):** [Get Agentic Architect](https://payhip.com/b/98aSq?utm_source=devto&utm_medium=02-scoped-singleton-di-bug&utm_campaign=paid_kit) *Originally published at [https://agenticstandardcontact-byte.github.io/agentic-architect/blog/02-scoped-singleton-di-bug.html](https://agenticstandardcontact-byte.github.io/agentic-architect/blog/02-scoped-singleton-di-bug.html). Part of the [Agentic Architect](https://agenticstandardcontact-byte.github.io/agentic-architect/) persistence kit for Cursor + .NET.*

    Tags

    csharpdotnetaicursor

    Comments

    More Blog

    View all
    This week in Cursor + .NET — 7 rules (week ending June 21, 2026)csharp

    This week in Cursor + .NET — 7 rules (week ending June 21, 2026)

    A weekly digest from the Agentic Architect persistence kit: 7 senior C#/.NET rules for engineers keeping Cursor honest across sessions.

    A
    Agentic Architect
    How Graphify Stopped My Team from Burning Thousands of Tokens Per Queryai

    How Graphify Stopped My Team from Burning Thousands of Tokens Per Query

    We were feeding Cursor 12 files per question. Graphify turned our React Native codebase into a knowledge graph — now it reads a scoped subgraph instead.

    V
    Vikrant Negi
    The Twenty-Dollar Anchor: What the AI Tool Pricing Guides Are Actually Telling Usai

    The Twenty-Dollar Anchor: What the AI Tool Pricing Guides Are Actually Telling Us

    I went down a rabbit hole this morning reading the late-2025 Juejin AI tool pricing guides back to...

    N
    ninghonggang
    Why the December 2025 AI IDE Rankings Are Scoring the Wrong Categoryai

    Why the December 2025 AI IDE Rankings Are Scoring the Wrong Category

    I spent the morning reading two December 2025 Juejin AI IDE ranking posts back to back, and the thing...

    N
    ninghonggang
    SpaceX is buying Cursor for $60B — the AI coding-tool race just got weirdai

    SpaceX is buying Cursor for $60B — the AI coding-tool race just got weird

    SpaceX is reportedly buying Cursor parent Anysphere for $60B. For builders, the big questions are model neutrality, compute, pricing, and trust.

    D
    Damien Gallagher
    This Week in AI: Claude Goes Dark, SpaceX Buys Cursor for $60Bcursor

    This Week in AI: Claude Goes Dark, SpaceX Buys Cursor for $60B

    Claude Fable 5 went dark by government order, SpaceX bought Cursor for $60B, OpenAI's real losses leaked, and GitHub nearly broke under AI agents.

    Z
    ZyVOP

    Stay up to date

    Get the latest Cursor prompts, rules, and resources delivered to your inbox weekly.

    Neura Market LogoNeura Market

    Discover the best AI prompts, plugins, and resources for Cursor and more.

    Content Types

    • Rules
    • Prompts
    • MCPs
    • Agents
    • Guides

    Platforms

    • ChatGPT Directory
    • Claude Directory
    • Gemini Directory
    • Cursor Directory
    • Grok Directory
    • Perplexity Directory
    • DeepSeek Directory
    • CoPilot Directory
    • Stable Diffusion Directory
    • Midjourney Directory
    • All Directories

    Resources

    • Blog
    • Documentation
    • Help Center
    • Marketplace

    Legal

    • Privacy Policy
    • Terms of Service

    © 2026 Neura Market. All rights reserved.

    |

    Not affiliated with any AI platform vendors.