Bump DependencyInjection.Lifetime.Analyzers and 3 others#291
Closed
dependabot[bot] wants to merge 1 commit into
Closed
Bump DependencyInjection.Lifetime.Analyzers and 3 others#291dependabot[bot] wants to merge 1 commit into
dependabot[bot] wants to merge 1 commit into
Conversation
Bumps DependencyInjection.Lifetime.Analyzers from 2.11.42 to 2.18.0 Bumps Microsoft.Extensions.Http.Polly from 9.0.0 to 9.0.17 Bumps System.IO.Hashing from 10.0.8 to 10.0.9 Bumps System.ServiceModel.Syndication from 9.0.0 to 9.0.17 --- updated-dependencies: - dependency-name: DependencyInjection.Lifetime.Analyzers dependency-version: 2.18.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: tests - dependency-name: Microsoft.Extensions.Http.Polly dependency-version: 9.0.17 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: tests - dependency-name: System.IO.Hashing dependency-version: 10.0.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: tests - dependency-name: System.ServiceModel.Syndication dependency-version: 9.0.17 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: tests ... Signed-off-by: dependabot[bot] <support@github.com>
Contributor
Author
|
Superseded by #292. |
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.
Updated DependencyInjection.Lifetime.Analyzers from 2.11.42 to 2.18.0.
Release notes
Sourced from DependencyInjection.Lifetime.Analyzers's releases.
2.18.0
DependencyInjection.Lifetime.Analyzers 2.18.0
Compile-time DI diagnostics for
Microsoft.Extensions.DependencyInjectionprojects that want earlier feedback on lifetime bugs, scope leaks, service locator drift, and unresolvable registrations.Why install or upgrade
IObservable<T>.Subscribe(...)returns anIDisposablesubscription token instead of needing a-=, so the event-leak proof inverts: where DI025 proves a missing unsubscription, DI027 proves the returned token is discarded. A transient- or scoped-registered service that subscribes an instance-capturing handler (method group,this-capturing lambda, or stored delegate) to an observable exposed by a longer-lived publisher — an injected singleton dependency, or a scoped publisher shared by a transient subscriber — and throws the token away roots every subscriber instance the container creates in the publisher, leaking memory on each resolution and firing stale observers against released state, the same accumulation DI025 catches for events. v1 stays conservative and detects only the highest-confidence discard shapes: an ignored expression statement (obs.Subscribe(H);), a discard assignment (_ = obs.Subscribe(H)), and a local initialized with the token that is never referenced again in the method and is not ausingdeclaration (a real disposal, return, or escape always references the local, so an unreferenced non-usinglocal is provably dropped). The subscribe call is matched FQN-light — any method namedSubscribereturningSystem.IDisposableon aSystem.IObservable<T>receiver — so System.Reactive, community Rx, and hand-rolled extensions all bind. Reuses DI025's proven infrastructure:EventReceiverClassification(injected-member proven-ctor-assigned, constructor-parameter, and stable chained-projection proofs such as_source.Ticks, via a newClassifyReceiverExpressionentry point that runs DI025's non-static receiver path without the event coupling — DI025's own behavior is byte-for-byte unchanged) andEventHandlerClassification(instance-capture proof), plus DI025's publisher-rank resolution (most conservative registration wins, closed registrations preferred over open-generic fallbacks, keyed-only registrations excluded). Single Warning tier for now — a scoped publisher above a transient subscriber reports Warning rather than an Info tier (scoped-publisher tiering is noted as future work). Documented false negatives, deferred to later passes: tokens stored in a field (dispose-path analysis),using/using varsubscriptions, tokens later disposed/returned/passed as arguments,CompositeDisposable/DisposeWith/AddTo/SerialDisposablepatterns, the BCLSubscribe(IObserver<T>)overload, and the staticObservableExtensions.Subscribe(source, handler)call form. No code fix this pass — the safe repair is registered-lifetime-dependent like DI025's tier-3 assist and is deferred.Install
What changed
Added
IObservable<T>.Subscribe(...)returns anIDisposablesubscription token instead of needing a-=, so the event-leak proof inverts: where DI025 proves a missing unsubscription, DI027 proves the returned token is discarded. A transient- or scoped-registered service that subscribes an instance-capturing handler (method group,this-capturing lambda, or stored delegate) to an observable exposed by a longer-lived publisher — an injected singleton dependency, or a scoped publisher shared by a transient subscriber — and throws the token away roots every subscriber instance the container creates in the publisher, leaking memory on each resolution and firing stale observers against released state, the same accumulation DI025 catches for events. v1 stays conservative and detects only the highest-confidence discard shapes: an ignored expression statement (obs.Subscribe(H);), a discard assignment (_ = obs.Subscribe(H)), and a local initialized with the token that is never referenced again in the method and is not ausingdeclaration (a real disposal, return, or escape always references the local, so an unreferenced non-usinglocal is provably dropped). The subscribe call is matched FQN-light — any method namedSubscribereturningSystem.IDisposableon aSystem.IObservable<T>receiver — so System.Reactive, community Rx, and hand-rolled extensions all bind. Reuses DI025's proven infrastructure:EventReceiverClassification(injected-member proven-ctor-assigned, constructor-parameter, and stable chained-projection proofs such as_source.Ticks, via a newClassifyReceiverExpressionentry point that runs DI025's non-static receiver path without the event coupling — DI025's own behavior is byte-for-byte unchanged) andEventHandlerClassification(instance-capture proof), plus DI025's publisher-rank resolution (most conservative registration wins, closed registrations preferred over open-generic fallbacks, keyed-only registrations excluded). Single Warning tier for now — a scoped publisher above a transient subscriber reports Warning rather than an Info tier (scoped-publisher tiering is noted as future work). Documented false negatives, deferred to later passes: tokens stored in a field (dispose-path analysis),using/using varsubscriptions, tokens later disposed/returned/passed as arguments,CompositeDisposable/DisposeWith/AddTo/SerialDisposablepatterns, the BCLSubscribe(IObserver<T>)overload, and the staticObservableExtensions.Subscribe(source, handler)call form. No code fix this pass — the safe repair is registered-lifetime-dependent like DI025's tier-3 assist and is deferred.Learn more
2.17.0
DependencyInjection.Lifetime.Analyzers 2.17.0
Compile-time DI diagnostics for
Microsoft.Extensions.DependencyInjectionprojects that want earlier feedback on lifetime bugs, scope leaks, service locator drift, and unresolvable registrations.Why install or upgrade
-=into a Dispose method that already existed; it refused whenever the type had no dispose-shaped method. Two new tiers extend it, both still gated on a method-group handler whose receiver resolves insideDispose. Tier 2 (inherited contract): when disposability comes from a base type that follows the standard virtualDispose(bool)pattern, the fix adds aprotected override void Dispose(bool disposing)that unsubscribes and chains tobase.Dispose(disposing)— overriding the pattern is what guarantees the unsubscribe actually runs, through the base'sDispose()→Dispose(true)dispatch. Inherited shapes with no such hook (a non-virtual or explicitly-implemented baseDispose) are refused, because a method the container never calls would be a fake repair. Tier 3 (implement the interface): a subscriber registered scoped that implements neither disposal interface getsIDisposableadded to its base list plus apublic void Dispose()that unsubscribes; the owning scope disposes it deterministically, so no leak is introduced. To make tier 3 possible without re-running registration collection, the analyzer now stamps the subscriber's registered lifetime into the diagnostic'sPropertiesbag (SubscriberLifetime=Transient/Scoped) — a purely additive change; all diagnostic messages are unchanged. IntroducingIDisposableon a transient subscriber is deliberately refused: a disposable transient is exactly the DI008 disposable-transient-capture shape, so the fix must never trade a DI025 for a DI008. DI026 only ever fires for transient subscribers, so its code fix offers tiers 1 and 2 but never tier 3. Lambda hoisting stays refused because it changes capture semantics. Two fixer-output edges were hardened after Codex review: tier 2 now accepts only the NEAREST inheritedDispose(bool)when it is a non-abstract, non-sealed,protectedvirtual/override hook — apublic/protected internalhook (accessibility mismatch, CS0507), anabstracthook (uncallablebase.Dispose(disposing)), and a sealed override on an intermediate base are all refused; tier 3 emits a fully-qualifiedglobal::System.IDisposablebase entry withSimplifier.Annotationso it binds correctly even withoutusing Systemor against a namespace-localIDisposable, reducing to the shortest unambiguous form. A second Codex-review round hardened three more edges: the addedDispose(bool)override now guards its unsubscribe withif (disposing)so managed state is not touched on the finalizer path; tier 2 additionally verifies the base's parameterlessDispose()actually dispatches to the bool hook in source (a non-dispatching or metadata-onlyDispose()is refused, since the override would never run); and the analyzer stampsSubscriberLifetime = Scopedonly when the subscriber has a scoped registration and NO transient one, so a subscriber registered both transient and scoped stampsTransientand tier 3 refuses it (its live transient registration is the DI008 risk). A third Codex-review round tightened that dispatch check further: the base'sDispose()must call its OWN hook — a bareDispose(true)orthis.Dispose(true)in its executable body, not inside a nested lambda or local function — so a call that disposes another object (_inner.Dispose(true),base.Dispose(true)), passesfalse, or never actually runs no longer counts as dispatch and is refused. Finally, the batch fix-all provider is replaced by a custom sequentialDocumentBasedFixAllProvider: batch-merging independent edits ran a synthesizing tier once per diagnostic and emitted a duplicate dispose member (or lost unsubscribes) when one type carried several leaks, so the fix-all now tags every subscription up front and re-evaluates each against the evolving document, merging the second leak onward into the member the first one created — oneDispose/override holding every-=(all under theif (disposing)guard for the override tier). A final round closed two more tier-2 fake-repair edges: the override is offered only when the subscriber actually implementsSystem.IDisposable(a base with the dispose shape but noIDisposablecontract is never disposed by the container), and the baseDispose()dispatch is now bound with the semantic model and required to resolve to the very hook being overridden — aDispose(true)that binds to a differentDispose(bool)(for example a grandparent's private hook the container's dispose path actually reaches) no longer counts.Install
What changed
Added
-=into a Dispose method that already existed; it refused whenever the type had no dispose-shaped method. Two new tiers extend it, both still gated on a method-group handler whose receiver resolves insideDispose. Tier 2 (inherited contract): when disposability comes from a base type that follows the standard virtualDispose(bool)pattern, the fix adds aprotected override void Dispose(bool disposing)that unsubscribes and chains tobase.Dispose(disposing)— overriding the pattern is what guarantees the unsubscribe actually runs, through the base'sDispose()→Dispose(true)dispatch. Inherited shapes with no such hook (a non-virtual or explicitly-implemented baseDispose) are refused, because a method the container never calls would be a fake repair. Tier 3 (implement the interface): a subscriber registered scoped that implements neither disposal interface getsIDisposableadded to its base list plus apublic void Dispose()that unsubscribes; the owning scope disposes it deterministically, so no leak is introduced. To make tier 3 possible without re-running registration collection, the analyzer now stamps the subscriber's registered lifetime into the diagnostic'sPropertiesbag (SubscriberLifetime=Transient/Scoped) — a purely additive change; all diagnostic messages are unchanged. IntroducingIDisposableon a transient subscriber is deliberately refused: a disposable transient is exactly the DI008 disposable-transient-capture shape, so the fix must never trade a DI025 for a DI008. DI026 only ever fires for transient subscribers, so its code fix offers tiers 1 and 2 but never tier 3. Lambda hoisting stays refused because it changes capture semantics. Two fixer-output edges were hardened after Codex review: tier 2 now accepts only the NEAREST inheritedDispose(bool)when it is a non-abstract, non-sealed,protectedvirtual/override hook — apublic/protected internalhook (accessibility mismatch, CS0507), anabstracthook (uncallablebase.Dispose(disposing)), and a sealed override on an intermediate base are all refused; tier 3 emits a fully-qualifiedglobal::System.IDisposablebase entry withSimplifier.Annotationso it binds correctly even withoutusing Systemor against a namespace-localIDisposable, reducing to the shortest unambiguous form. A second Codex-review round hardened three more edges: the addedDispose(bool)override now guards its unsubscribe withif (disposing)so managed state is not touched on the finalizer path; tier 2 additionally verifies the base's parameterlessDispose()actually dispatches to the bool hook in source (a non-dispatching or metadata-onlyDispose()is refused, since the override would never run); and the analyzer stampsSubscriberLifetime = Scopedonly when the subscriber has a scoped registration and NO transient one, so a subscriber registered both transient and scoped stampsTransientand tier 3 refuses it (its live transient registration is the DI008 risk). A third Codex-review round tightened that dispatch check further: the base'sDispose()must call its OWN hook — a bareDispose(true)orthis.Dispose(true)in its executable body, not inside a nested lambda or local function — so a call that disposes another object (_inner.Dispose(true),base.Dispose(true)), passesfalse, or never actually runs no longer counts as dispatch and is refused. Finally, the batch fix-all provider is replaced by a custom sequentialDocumentBasedFixAllProvider: batch-merging independent edits ran a synthesizing tier once per diagnostic and emitted a duplicate dispose member (or lost unsubscribes) when one type carried several leaks, so the fix-all now tags every subscription up front and re-evaluates each against the evolving document, merging the second leak onward into the member the first one created — oneDispose/override holding every-=(all under theif (disposing)guard for the override tier). A final round closed two more tier-2 fake-repair edges: the override is offered only when the subscriber actually implementsSystem.IDisposable(a base with the dispose shape but noIDisposablecontract is never disposed by the container), and the baseDispose()dispatch is now bound with the semantic model and required to resolve to the very hook being overridden — aDispose(true)that binds to a differentDispose(bool)(for example a grandparent's private hook the container's dispose path actually reaches) no longer counts.Learn more
2.16.0
DependencyInjection.Lifetime.Analyzers 2.16.0
Compile-time DI diagnostics for
Microsoft.Extensions.DependencyInjectionprojects that want earlier feedback on lifetime bugs, scope leaks, service locator drift, and unresolvable registrations.Why install or upgrade
_bus.Handlers += OnMessageand the equivalent self-assignment_bus.Handlers = (EventHandler)Delegate.Combine(_bus.Handlers, OnMessage)now report identically to an event+=(singleton publisher → DI025 Warning, scoped publisher → DI026 Info), with a mirroredDelegate.Removeself-assignment recognized as the matching unsubscription. Only the trivially-provable self-assignment form is reported — the firstDelegate.Combineargument must be the same member the result is assigned back to, reached through the same receiver — so indirect shapes (result stored in a local or a different member) stay silent. This required generalizing the subscription record's member fromIEventSymboltoISymboland teaching the handler classifier to resolve the single unambiguous method-group candidate that a bareDelegate.Combineargument leaves with a null symbol (no single target delegate type). It matters because event-style delegate accumulation on a long-lived publisher roots every subscriber the container creates, exactly like an event+=, and was invisible before.WeakEventManager.AddHandler(...)) stays silent (not a+=/Combine), a static-event-=in Dispose suppresses, a scoped subscriber on a static (process-lifetime) event reports DI025 at Warning and never the DI026 Info tier, a branch-conditional-=(if (_attached) { _bus.E -= H; }) suppresses unconditionally, and a self-unsubscribing handler (_bus.E -= OnMessageinside the handler body) stays silent. The branch-conditional suppression is a deliberate, documented false negative that favours FP-safety over proving the guard always runs.Install
What changed
Added
_bus.Handlers += OnMessageand the equivalent self-assignment_bus.Handlers = (EventHandler)Delegate.Combine(_bus.Handlers, OnMessage)now report identically to an event+=(singleton publisher → DI025 Warning, scoped publisher → DI026 Info), with a mirroredDelegate.Removeself-assignment recognized as the matching unsubscription. Only the trivially-provable self-assignment form is reported — the firstDelegate.Combineargument must be the same member the result is assigned back to, reached through the same receiver — so indirect shapes (result stored in a local or a different member) stay silent. This required generalizing the subscription record's member fromIEventSymboltoISymboland teaching the handler classifier to resolve the single unambiguous method-group candidate that a bareDelegate.Combineargument leaves with a null symbol (no single target delegate type). It matters because event-style delegate accumulation on a long-lived publisher roots every subscriber the container creates, exactly like an event+=, and was invisible before.Changed
WeakEventManager.AddHandler(...)) stays silent (not a+=/Combine), a static-event-=in Dispose suppresses, a scoped subscriber on a static (process-lifetime) event reports DI025 at Warning and never the DI026 Info tier, a branch-conditional-=(if (_attached) { _bus.E -= H; }) suppresses unconditionally, and a self-unsubscribing handler (_bus.E -= OnMessageinside the handler body) stays silent. The branch-conditional suppression is a deliberate, documented false negative that favours FP-safety over proving the guard always runs.Learn more
2.15.0
DependencyInjection.Lifetime.Analyzers 2.15.0
Compile-time DI diagnostics for
Microsoft.Extensions.DependencyInjectionprojects that want earlier feedback on lifetime bugs, scope leaks, service locator drift, and unresolvable registrations.Why install or upgrade
ReportLeakedSubscriptionsat cyclomatic complexity 28; receiver classification (chain walking, stable-projection proofs, canonicalization, injection provenance) now lives inInfrastructure/EventReceiverClassification.csand handler classification (capture analysis, identity matching) inInfrastructure/EventHandlerClassification.cs, with the reporting pass decomposed into single-purpose gates. The extraction also positions the planned Rx subscription-leak rule (DI027) to reuse receiver classification instead of duplicating it.Install
What changed
Changed
ReportLeakedSubscriptionsat cyclomatic complexity 28; receiver classification (chain walking, stable-projection proofs, canonicalization, injection provenance) now lives inInfrastructure/EventReceiverClassification.csand handler classification (capture analysis, identity matching) inInfrastructure/EventHandlerClassification.cs, with the reporting pass decomposed into single-purpose gates. The extraction also positions the planned Rx subscription-leak rule (DI027) to reuse receiver classification instead of duplicating it.Learn more
2.14.0
DependencyInjection.Lifetime.Analyzers 2.14.0
Compile-time DI diagnostics for
Microsoft.Extensions.DependencyInjectionprojects that want earlier feedback on lifetime bugs, scope leaks, service locator drift, and unresolvable registrations.Why install or upgrade
_host.Bus.Changed += OnChangednow reports when the publisher is a stable projection of an injected chain root: the lifetime proof anchors on the chain root's registration (singleton root → DI025 Warning, scoped root → DI026 Info), and every intermediate segment must provably return the same instance for the root's whole lifetime — a readonly field, a get-only auto-property, or a getter returning one, with interface segments proven through the root's registered implementation types. Settable, computed, metadata-only, and virtual segments keep the chain silent (a_factory.Buscomputed getter handing out a fresh bus per access must not warn), as do factory registrations with no visible implementation type and chain roots that are not provably injected. Unsubscription matching is path-aware: a-=through the same chain suppresses (constructor-parameter roots unify with the field they are stored into), while a-=through a different root still reports.-=Dispose insertion now covers field/property-rooted chains — the cloned chain re-resolves verbatim inside Dispose. Constructor-parameter-rooted chains are refused (the cloned statement would not compile), matching the existing direct-receiver gate.Install
What changed
Added
_host.Bus.Changed += OnChangednow reports when the publisher is a stable projection of an injected chain root: the lifetime proof anchors on the chain root's registration (singleton root → DI025 Warning, scoped root → DI026 Info), and every intermediate segment must provably return the same instance for the root's whole lifetime — a readonly field, a get-only auto-property, or a getter returning one, with interface segments proven through the root's registered implementation types. Settable, computed, metadata-only, and virtual segments keep the chain silent (a_factory.Buscomputed getter handing out a fresh bus per access must not warn), as do factory registrations with no visible implementation type and chain roots that are not provably injected. Unsubscription matching is path-aware: a-=through the same chain suppresses (constructor-parameter roots unify with the field they are stored into), while a-=through a different root still reports.-=Dispose insertion now covers field/property-rooted chains — the cloned chain re-resolves verbatim inside Dispose. Constructor-parameter-rooted chains are refused (the cloned statement would not compile), matching the existing direct-receiver gate.Learn more
2.13.0
DependencyInjection.Lifetime.Analyzers 2.13.0
Compile-time DI diagnostics for
Microsoft.Extensions.DependencyInjectionprojects that want earlier feedback on lifetime bugs, scope leaks, service locator drift, and unresolvable registrations.Why install or upgrade
-=anywhere in the type, now reports at Info: every transient the scope resolves stays rooted in the publisher's delegate list until the scope is disposed, and the event keeps invoking handlers on released instances — mostly benign in per-request scopes, a real accumulation in long-lived ones (SignalR connections, Blazor circuits, hosted-service loop scopes). Raise per team policy withdotnet_diagnostic.DI026.severity = warning. All DI025 receiver/handler/unsubscription proofs, guardrails, and the three message arms carry over unchanged; scoped subscribers on scoped publishers stay silent (equal lifetimes are torn down together). Three previously-silent cells now report DI026: the plain scoped-publisher/transient-subscriber pairing, open-generic scoped publishers injected as constructed closures, and — because the most conservative registration wins — publishers registered both scoped and singleton, including a closed scoped registration overriding an open-generic singleton.-=Dispose insertion now also fixes DI026 diagnostics, with the same method-group, disposal-contract, and receiver-availability gates.Install
What changed
Added
-=anywhere in the type, now reports at Info: every transient the scope resolves stays rooted in the publisher's delegate list until the scope is disposed, and the event keeps invoking handlers on released instances — mostly benign in per-request scopes, a real accumulation in long-lived ones (SignalR connections, Blazor circuits, hosted-service loop scopes). Raise per team policy withdotnet_diagnostic.DI026.severity = warning. All DI025 receiver/handler/unsubscription proofs, guardrails, and the three message arms carry over unchanged; scoped subscribers on scoped publishers stay silent (equal lifetimes are torn down together). Three previously-silent cells now report DI026: the plain scoped-publisher/transient-subscriber pairing, open-generic scoped publishers injected as constructed closures, and — because the most conservative registration wins — publishers registered both scoped and singleton, including a closed scoped registration overriding an open-generic singleton.-=Dispose insertion now also fixes DI026 diagnostics, with the same method-group, disposal-contract, and receiver-availability gates.Learn more
2.12.0
DependencyInjection.Lifetime.Analyzers 2.12.0
Compile-time DI diagnostics for
Microsoft.Extensions.DependencyInjectionprojects that want earlier feedback on lifetime bugs, scope leaks, service locator drift, and unresolvable registrations.Why install or upgrade
-=anywhere in the type, now reports. The publisher's delegate list roots every subscriber instance the container ever creates — the classic .NET event-handler memory leak, caught lifetime-aware. Handler identity is symbol-based, so the no-op unsubscribe bug (-=with a distinct but textually identical lambda) still reports and points at the ineffective-=; override chains are normalized so a base-class-=pairs with a derived-class+=. Singleton subscribers, matching unsubscriptions, static/this-free handlers, non-injected publishers, and unknown shapes all stay silent.Dispose()/Dispose(bool)/DisposeAsync()implementing the matching disposal interface, the fix inserts the mirrored-=at the top of that method. IntroducingIDisposableis intentionally not offered (it would change container disposal tracking and trip DI008 on transients).Install
What changed
Added
-=anywhere in the type, now reports. The publisher's delegate list roots every subscriber instance the container ever creates — the classic .NET event-handler memory leak, caught lifetime-aware. Handler identity is symbol-based, so the no-op unsubscribe bug (-=with a distinct but textually identical lambda) still reports and points at the ineffective-=; override chains are normalized so a base-class-=pairs with a derived-class+=. Singleton subscribers, matching unsubscriptions, static/this-free handlers, non-injected publishers, and unknown shapes all stay silent.Dispose()/Dispose(bool)/DisposeAsync()implementing the matching disposal interface, the fix inserts the mirrored-=at the top of that method. IntroducingIDisposableis intentionally not offered (it would change container disposal tracking and trip DI008 on transients).Learn more
2.11.43
DependencyInjection.Lifetime.Analyzers 2.11.43
Compile-time DI diagnostics for
Microsoft.Extensions.DependencyInjectionprojects that want earlier feedback on lifetime bugs, scope leaks, service locator drift, and unresolvable registrations.Why install or upgrade
Dispose()method callsDispose(true)and theDispose(bool)overload disposes the provider.Install
What changed
Fixed
Dispose()method callsDispose(true)and theDispose(bool)overload disposes the provider.Learn more
Commits viewable in compare view.
Updated Microsoft.Extensions.Http.Polly from 9.0.0 to 9.0.17.
Release notes
Sourced from Microsoft.Extensions.Http.Polly's releases.
9.0.17
Release
What's Changed
Full Changelog: dotnet/aspnetcore@v9.0.16...v9.0.17
9.0.16
Release
What's Changed
73a63eatod72f9c8by @dependabot[bot] in [release/9.0] (deps): Bump src/submodules/googletest from73a63eatod72f9c8dotnet/aspnetcore#66088Full Changelog: dotnet/aspnetcore@v9.0.15...v9.0.16
9.0.15
Release
What's Changed
56efe39to73a63eaby @dependabot[bot] in [release/9.0] (deps): Bump src/submodules/googletest from56efe39to73a63eadotnet/aspnetcore#65587Full Changelog: dotnet/aspnetcore@v9.0.14...v9.0.15
9.0.14
Release
What's Changed
9156d4cto56efe39by @dependabot[bot] in [release/9.0] (deps): Bump src/submodules/googletest from9156d4cto56efe39dotnet/aspnetcore#65290Full Changelog: dotnet/aspnetcore@v9.0.13...v9.0.14
9.0.13
Release
What's Changed
1b96fa1to9156d4cby @dependabot[bot] in [release/9.0] (deps): Bump src/submodules/googletest from1b96fa1to9156d4cdotnet/aspnetcore#64908Full Changelog: dotnet/aspnetcore@v9.0.12...v9.0.13)
9.0.12
Release
What's Changed
Microsoft.Buildversions to 17.8.43 by @MackinnonBuck in UpdateMicrosoft.Buildversions to 17.8.43 dotnet/aspnetcore#642779706f75to6ec14dfby @dependabot[bot] in [release/9.0] (deps): Bump src/submodules/googletest from9706f75to6ec14dfdotnet/aspnetcore#642306ec14dfto1b96fa1by @dependabot[bot] in [release/9.0] (deps): Bump src/submodules/googletest from6ec14dfto1b96fa1dotnet/aspnetcore#64580Full Changelog: dotnet/aspnetcore@v9.0.11...v9.0.12
9.0.11
Release
What's Changed
eb2d85eto9706f75by @dependabot[bot] in [release/9.0] (deps): Bump src/submodules/googletest fromeb2d85eto9706f75dotnet/aspnetcore#63894Full Changelog: dotnet/aspnetcore@v9.0.10...v9.0.11
9.0.10
Release
What's Changed
373af2etoeb2d85eby @dependabot[bot] in [release/9.0] (deps): Bump src/submodules/googletest from373af2etoeb2d85edotnet/aspnetcore#63501RadioButtonGetsResetAfterSubmittingEnhancedFormby @ilonatommy in UnquarantineRadioButtonGetsResetAfterSubmittingEnhancedFormdotnet/aspnetcore#63556Full Changelog: dotnet/aspnetcore@v9.0.9...v9.0.10
9.0.9
Release
What's Changed
c67de11to373af2eby @dependabot[bot] in [release/9.0] (deps): Bump src/submodules/googletest fromc67de11to373af2edotnet/aspnetcore#63035Full Changelog: dotnet/aspnetcore@v9.0.8...v9.0.9
9.0.7
Release
What's Changed
04ee1b4toe9092b1by @dependabot in [release/9.0] (deps): Bump src/submodules/googletest from04ee1b4toe9092b1dotnet/aspnetcore#62199Full Changelog: dotnet/aspnetcore@v9.0.6...v9.0.7
9.0.6
Bug Fixes
The Forwarded Headers Middleware now ignores
X-Forwarded-Headerssent from unknown proxies. This change improves security by ensuring that only trusted proxies can influence forwarded header values, preventing potential spoofing or misrouting issues.Dependency Updates
52204f7to04ee1b4(#61762)Updates the GoogleTest submodule to a newer commit, bringing in the latest improvements and bug fixes from the upstream project.
Updates internal build and infrastructure dependencies from the dotnet/arcade repository, ensuring compatibility and access to the latest build tools.
Refreshes dependencies from the dotnet/extensions repository, incorporating the latest features and fixes from the extensions libraries.
Further updates dependencies from dotnet/extensions, ensuring the project benefits from recent improvements and bug fixes.
Additional updates to build and infrastructure dependencies from dotnet/arcade, maintaining up-to-date tooling and build processes.
Miscellaneous
Updates the project version and branding to 9.0.6, reflecting the new release and ensuring version consistency across the codebase.
Incorporates various internal commits into the release/9.0 branch, ensuring that all relevant changes are included in this release.
This summary is generated and may contain inaccuracies. For complete details, please review the linked pull requests.
Full Changelog: v9.0.5...v9.0.6
9.0.5
Release
What's Changed
24a9e94to52204f7by @dependabot in [release/9.0] (deps): Bump src/submodules/googletest from24a9e94to52204f7dotnet/aspnetcore#61261Full Changelog: dotnet/aspnetcore@v9.0.4...v9.0.5
9.0.4
Release
What's Changed
e235eb3to24a9e94by @dependabot in [release/9.0] (deps): Bump src/submodules/googletest frome235eb3to24a9e94dotnet/aspnetcore#60678Full Changelog: dotnet/aspnetcore@v9.0.3...v9.0.4
9.0.3
Release
What's Changed
HtmlAttributePropertyHelperto correctly follow theMetadataUpdateHandlerAttributecontract by @github-actions in [release/9.0] UpdateHtmlAttributePropertyHelperto correctly follow theMetadataUpdateHandlerAttributecontract dotnet/aspnetcore#599087d76a23toe235eb3by @dependabot in [release/9.0] (deps): Bump src/submodules/googletest from7d76a23toe235eb3dotnet/aspnetcore#60151Full Changelog: dotnet/aspnetcore@v9.0.2...v9.0.3
9.0.2
Release
What's Changed
d144031to7d76a23by @dependabot in [release/9.0] (deps): Bump src/submodules/googletest fromd144031to7d76a23dotnet/aspnetcore#59679index.htmlduring development by @MackinnonBuck in [release/9.0] [Blazor WASM standalone] Avoid cachingindex.htmlduring development dotnet/aspnetcore#59348Full Changelog: dotnet/aspnetcore@v9.0.1...v9.0.2
9.0.1
Release
What's Changed
Description has been truncated