Uh oh!
There was an error while loading. Please reload this page.
Azure Blob Storage projections page, corrected against the shipped API - #10
Conversation
The page was written against the pre-review API of Eventuous/eventuous#550, so it carried mistakes that the package README had already been corrected for. Fixes that make the samples compile: - the third constructor argument is BlobStorageProjectorOptions, not JsonSerializerOptions, so the IOptions<JsonSerializerOptions> example was invalid; show BlobStorageProjectorOptions.JsonOptions instead - typeof(T) is not in scope in a concrete projector deriving from BlobStorageProjector<T>; drop it from the GetBlobName example Corrections: - the intro said Eventuous supports "Azure Service Bus" for projections - getBlobId returns a blob ID, not a full name, so the example producing "payments/{id}.json" actually wrote payments/{id}.json/BookingState.json - overriding both GetBlobName overloads is misleading, because the default two-argument implementation delegates to the one-argument one Content missing from the page but present in the README: - the container must exist; the projector doesn't create it - ByGlobalPosition silently ignores everything after the first event on subscriptions whose global position is always zero - both constructor overloads - stream name and message ID are stored percent-encoded, as Azure requires ASCII metadata values Also add a registration section matching the other infra pages, list the projector on the supported projectors page, and fix a typo, a missing blank line before a heading, and the missing trailing newline. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Deploying with |
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs | eventuous-docs | f9a0eb9 | Commit Preview URL Branch Preview URL | Aug 21 2026, 11:17 AM |
PR Summary by QodoFix and expand Azure Blob Storage projection docs to match shipped API
AI Description
Diagram
High-Level Assessment
Files changed (2) |
Two problems in the "Custom blob naming" section, both mirrored in the docs site page (Eventuous/eventuous-docs#10): - `typeof(T)` doesn't compile in the example's context: `T` is the base class's type parameter and isn't in scope inside a concrete projector deriving from `BlobStorageProjector<T>` - overriding both `GetBlobName` overloads is misleading, because the default two-argument implementation delegates to the one-argument one, so a one-argument override is never called once the two-argument one is replaced Show the two overrides as the alternatives they are, and say which one wins when both are present. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Code Review by Qodo
1. Missing trailing newline |
| - [Azure Blob Storage projections](../../infra/azure-blob-storage) | ||
| You can project to any other database using a custom projector, which can be built as a [custom event handler](../../subscriptions/eventhandler#custom-handlers). No newline at end of file |
There was a problem hiding this comment.
1. Missing trailing newline 🐞 Bug⚙ Maintainability
The modified Markdown file still has no trailing newline, which can cause noisy diffs and formatting issues in some tooling. Since this PR touched the file, it should be fixed as part of this change.
Agent Prompt
## Issue description
`src/content/docs/dotnet-next/read-models/supported-projectors.md` is missing a trailing newline (`\ No newline at end of file` in the diff). This commonly causes unnecessary future diffs and can trip formatting/lint tooling.
## Issue Context
The PR updates this file to add the Azure Blob Storage projector link, and the patch indicates the file still does not end with a newline.
## Fix Focus Areas
- src/content/docs/dotnet-next/read-models/supported-projectors.md[12-14]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Uh oh!
There was an error while loading. Please reload this page.
…#578) * fix: dispose locals flagged by CodeQL cs/local-not-disposed - Blob projector tests: hoist the upload MemoryStreams into `using var`, matching what BlobStorageProjector itself already does. The Azure SDK does not dispose caller-supplied streams, so ownership was ours. - ElasticSerializer: dispose the Utf8JsonWriter. It rents buffers from ArrayPool and only Dispose returns them. Disposal flushes and does not close the caller's stream, so it is safe on a serializer contract. - ElasticSerializer: drop the BinaryReader and deserialize straight from the stream. Adding `using` there would have closed the caller's stream, and the reader only added a full copy of the payload. This also removes the stream.Length call, so non-seekable streams now work. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs: fix the blob projector README custom naming example Two problems in the "Custom blob naming" section, both mirrored in the docs site page (Eventuous/eventuous-docs#10): - `typeof(T)` doesn't compile in the example's context: `T` is the base class's type parameter and isn't in scope inside a concrete projector deriving from `BlobStorageProjector<T>` - overriding both `GetBlobName` overloads is misleading, because the default two-argument implementation delegates to the one-argument one, so a one-argument override is never called once the two-argument one is replaced Show the two overrides as the alternatives they are, and say which one wins when both are present. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Supersedes #4 — this branch carries @quezlatch's original commits plus a correction pass, so their authorship is preserved. Close#4 in favour of this one if it looks right.
The page was written against the pre-review API of Eventuous/eventuous#550. That PR's review corrected the package README, but those corrections never made it to the docs page, so it shipped with samples that don't compile and without the two warnings that matter operationally.
Samples that didn't compile
BlobStorageProjectorOptions, notJsonSerializerOptions. TheIOptions<JsonSerializerOptions>example was invalid —serializerOptionswas dropped from the constructor during #550 and folded intoBlobStorageProjectorOptions.JsonOptions. Also, ASP.NET Core doesn't registerJsonSerializerOptionsas an options type; the example now usesMicrosoft.AspNetCore.Http.Json.JsonOptions.typeof(T)isn't in scope in a concrete projector deriving fromBlobStorageProjector<T>.Wrong
getBlobIdreturns a blob ID, not a full name, and the result still goes throughGetBlobName. The example returningpayments/{id}.jsonactually wrote topayments/{id}.json/BookingState.json.GetBlobNameoverloads is misleading: the default two-argument implementation delegates to the one-argument one, so overriding the two-argument version makes a one-argument override dead code.Missing
All of this is in the package README but wasn't on the page:
CreateIfNotExistsAsync()to the sample's startup because of this.ByGlobalPositionrequires real global positions. On a subscription where the global position is always zero, the first event stores0and every subsequent event is silently ignored. The projector logs a runtime warning for this.RaceRetriesexhausted returnsEventHandlingStatus.Failure.Added
azure-service-bus.md, coveringBlobServiceClientin DI and wiring the projection into a subscription.## Features, trailing newline.The two warnings use
:::cautionasides, matchingmssql.mdandkafka.md.Verification
astro buildpasses, 157 pages. Both asides render, and all three relative links (read-models/rm-concept,subscriptions/subs-concept,subscriptions/checkpoint) resolve to pages present indist/.Follow-up, not in this PR
src/Azure/src/Eventuous.Azure.Storage.Blobs/README.mdin the library repo has the same two code bugs — the out-of-scopetypeof(T)at line 87 and the double-override example. They weren't caught in the #550 review and need a separate fix there.🤖 Generated with Claude Code