2.7 KiB
Index — EditModalSaveContextHolder Missing DI Registration (BlazorBlocks / AuthBlocks)
Status: ✅ RESOLVED — shipped in Cerebellum.BlazorBlocks.Web 10.3.33 + Cerebellum.AuthBlocks.Web 10.3.36 (2026-06-20). scoped, not yet started. Confirmed against Cerebellum.BlazorBlocks.Web 10.3.32 / Cerebellum.AuthBlocks.Web 10.3.33. Author: product-designer. Date: 2026-06-19.
Resolution (2026-06-20):
AddBlazorBlocksWeb()landed inCerebellum.BlazorBlocks.Web10.3.33 andConfigureAuthServicescalls it inCerebellum.AuthBlocks.Web10.3.36; DeepDrftManager picked up 10.3.36 and removed its localEditModalSaveContextHolderstopgap. This brief is retained as historical record — no further action required.
The defect
BlazorBlocks' ModelView / EditModelModal components have a required [Inject] dependency on
Web.Maintenance.Entities.EditModalSaveContextHolder (a per-circuit save bridge), but the BlazorBlocks
Web package ships no registration extension for it and AuthBlocks' ConfigureAuthServices never registers
it either. Any consumer of a ModelView-based page (e.g. AuthBlocks' Users.razor /
Registrations.razor) crashes the Blazor circuit on navigation with an unregistered-service
InvalidOperationException. Two independent downstream products have each hand-registered the internal
service as a stopgap — the tell that this is a leaked library registration.
The two-team layered fix (ordered — do not reorder)
- BlazorBlocks ships first. Add a Web-side
AddBlazorBlocksWeb()extension that registers the holder viaTryAddScoped(scoped is required). BumpCerebellum.BlazorBlocks.Webfrom 10.3.32; report the new version. - AuthBlocks ships second. Bump its
Cerebellum.BlazorBlocks.Webreference to that new version, callAddBlazorBlocksWeb()fromConfigureAuthServices, bumpCerebellum.AuthBlocks.Webfrom 10.3.33.
AuthBlocks is blocked until BlazorBlocks' new version is published. Registration lives with its owner
(BlazorBlocks); AuthBlocks stays self-contained by composing it. MudBlazor (AddMudServices) stays a
caller-owned prerequisite throughout.
The detail lives in the two team briefs
Each is fully self-contained for an orchestrator working in only that one repo:
- BlazorBlocks team →
team-brief-blazorblocks-modelview-di.md(root cause,[Inject]audit, lifetime rationale, the new extension, version bump, acceptance criteria). - AuthBlocks team →
team-brief-authblocks-modelview-di.md(the blocking BlazorBlocks prerequisite, theConfigureAuthServicescall, version bump, acceptance criteria).