From a884ad18ddf200191be91c643f56af5942c05fbd Mon Sep 17 00:00:00 2001 From: Mihail Gribkov <61027276+Misha-133@users.noreply.github.com> Date: Sun, 1 Dec 2024 20:32:26 +0300 Subject: [PATCH] [Fix] Interaction Service failing to create scopes with some DI providers (#3031) --- src/Discord.Net.Interactions/Builders/ModuleBuilder.cs | 8 +++++++- src/Discord.Net.Interactions/Info/Commands/CommandInfo.cs | 8 ++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Interactions/Builders/ModuleBuilder.cs b/src/Discord.Net.Interactions/Builders/ModuleBuilder.cs index 6b4883f1..c33ffbc4 100644 --- a/src/Discord.Net.Interactions/Builders/ModuleBuilder.cs +++ b/src/Discord.Net.Interactions/Builders/ModuleBuilder.cs @@ -462,9 +462,12 @@ namespace Discord.Interactions.Builders { if (TypeInfo is not null && ModuleClassBuilder.IsValidModuleDefinition(TypeInfo)) { - using var scope = services?.CreateScope(); + IServiceScope scope = null; if (interactionService._autoServiceScopes) + { + scope = services?.CreateScope(); services = scope?.ServiceProvider ?? EmptyServiceProvider.Instance; + } var instance = ReflectionUtils.CreateObject(TypeInfo, interactionService, services); @@ -473,10 +476,13 @@ namespace Discord.Interactions.Builders instance.Construct(this, interactionService); var moduleInfo = new ModuleInfo(this, interactionService, services, parent); instance.OnModuleBuilding(interactionService, moduleInfo); + + scope?.Dispose(); return moduleInfo; } finally { + scope?.Dispose(); (instance as IDisposable)?.Dispose(); } } diff --git a/src/Discord.Net.Interactions/Info/Commands/CommandInfo.cs b/src/Discord.Net.Interactions/Info/Commands/CommandInfo.cs index 475d140e..ee9a47c0 100644 --- a/src/Discord.Net.Interactions/Info/Commands/CommandInfo.cs +++ b/src/Discord.Net.Interactions/Info/Commands/CommandInfo.cs @@ -113,10 +113,12 @@ namespace Discord.Interactions { await CommandService._cmdLogger.DebugAsync($"Executing {GetLogString(context)}").ConfigureAwait(false); - using var scope = services?.CreateScope(); - + IServiceScope scope = null; if (CommandService._autoServiceScopes) + { + scope = services?.CreateScope(); services = scope?.ServiceProvider ?? EmptyServiceProvider.Instance; + } try { @@ -179,11 +181,13 @@ namespace Discord.Interactions ExceptionDispatchInfo.Capture(ex).Throw(); } + scope?.Dispose(); return result; } finally { await CommandService._cmdLogger.VerboseAsync($"Executed {GetLogString(context)}").ConfigureAwait(false); + scope?.Dispose(); } }