Repository navigation
feat: phase 9 host integration (CFG-1..-38 subset, SEAM-5, SEAM-6, OBS-35) - #98
Merged
Merged
Conversation
…S-35) Adds Dexpace.Sdk.Extensions.DependencyInjection: AddDexpaceClient and the sealed DexpaceClientBuilder register a client as keyed singletons over a named IHttpClientFactory client with a redirect-off primary handler and a container-owned lease that releases it. Settings are read by a hand-written configuration reader (the binder cannot set init accessors and is not AOT-safe) and validated on start without quoting configured values. Also: SystemNetHttpClient.CreatePrimaryHandler, the ConfigurationBinder ban, a per-library policy record in the dependency audit, a third conformance driver over the DI-built transport, NamedClientRedirectWireTests (Security), AOT smoke coverage, the checklist, the user page and dated design corrections. Closes #96
Contributor
Author
Review recordBuilt in one pass from the design and plan, reviewed read-only against the design and spec with every finding reproduced before it was reported, then the confirmed findings were fixed. Confirmed findings (all fixed)
Rejected candidates
Builder deviations (all accepted by the review)
Checks after the fixes
|
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
Phase 9 of the v1 roadmap: host integration, the new package
Dexpace.Sdk.Extensions.DependencyInjection. Design and plan:docs/work/mvp/phase9/(planning #94, #95). Checklist:docs/work/mvp/phase9/2026-10-12-phase9-host-integration-checklist.md. User page:docs/sdk-documentation/dependency-injection.md.Closes #96
AddDexpaceClient(name[, IConfigurationSection])returns a sealedDexpaceClientBuilder(Configure,ConfigureTransport,ConfigureCredentials,UseTransport,UseSerde,UseAuth,UseAuthPolicy,AddPolicy,UseProxyFromEnvironment,HttpClient). The client is registered as keyed singletons (HttpPipeline,IAsyncHttpClient,ISerde,DexpaceClientOptions).initaccessor; the reflection mode is not AOT-safe). Base-10 integers, strict booleans,CFG-7durations, enums by name, lists that replace defaults. An empty value is absent. Every bad key, rejected value and unknown key (at any depth, group keys included) failsValidateOnStartas"<path>: <rule>", never quoting a configured value.ConfigurationBinderis banned insrc/.IHttpClientFactorywith a redirect-off primary (SystemNetHttpClient.CreatePrimaryHandler, the one place the owned-handler invariants are built), no factory loggers, an infinite handler lifetime with a pooled-connection lifetime, and a container-owned lease that releases the primary.scripts/ci/dependency-audit.csholds each library to a policy record (one third-party root plus the first-party projects it names). A third conformance driver runs the kit over the DI-built transport on both faces with the two permanent waivers. NewSecurityclassNamedClientRedirectWireTests(phase 1 S3 row 9). AOT smoke covers the package.Requirements
15 owned rows:
CFG-1,-2,-3,-4,-5,-6,-7,-10,-11,-14,-37,-38,SEAM-5,SEAM-6,OBS-35. 13 ✅ / 2 N/A / 0 🚫 / 0 ⏳.CFG-2(fall-through to a lower tier, §10 entry 25),CFG-5,CFG-6,CFG-7,OBS-35(never-throw clauses, §10 entry 26).CFG-4,CFG-10(vacuous in this port).SEAM-5,SEAM-6: ✅ for the DI half; the DI-less half stays N/A (2b).SEAM-7,TRANSPORT-1,XCUT-10.Verification
Linux, .NET SDK 10.0.401.
dotnet build(Release, 0 warnings),dotnet format --verify-no-changesanddotnet test --solution Dexpace.Sdk.slngreen: 6 857 tests, 0 failed, 22 skippeddotnet pack; dependency audit (5 libraries conform); reproducible pack byte-identicalall checks passedPublicAPI.Unshipped.txtupdated (new package;SystemNetgainsCreatePrimaryHandler), newpackages.lock.jsonfiles committed, locked restore clean on both solutionsscripts/knowledge verify-structureOKRecords
CHANGELOG.md[Unreleased]entries (Added, plus theXCUT-10resilience-handler guidance)docs/first-release.mdupdateddocs/sdk-documentation/pages describe the codeLead rulings
Taken at the recommended defaults: P9-1, -2, -4, -5, -7, -9, -10, -12, -15, -16, -17, -19, -20, -28, -29. Worth reviewing:
CFG-2): an empty value silently shadows a lower provider's value (option B would fail start).