From 54e841694e413b83f9b2f47ea619986fe9d396ee Mon Sep 17 00:00:00 2001 From: Mihail Gribkov <61027276+Misha-133@users.noreply.github.com> Date: Sun, 9 Mar 2025 21:52:53 +0300 Subject: [PATCH] Add empty service scopes (#3078) --- .../Builders/ModuleBuilder.cs | 15 ++++----- .../Utilities/EmptyServiceProvider.cs | 32 +++++++++++++++---- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/Discord.Net.Interactions/Builders/ModuleBuilder.cs b/src/Discord.Net.Interactions/Builders/ModuleBuilder.cs index 701da645..9108b317 100644 --- a/src/Discord.Net.Interactions/Builders/ModuleBuilder.cs +++ b/src/Discord.Net.Interactions/Builders/ModuleBuilder.cs @@ -467,12 +467,13 @@ namespace Discord.Interactions.Builders { if (TypeInfo is not null && ModuleClassBuilder.IsValidModuleDefinition(TypeInfo)) { - IServiceScope scope = null; - if (interactionService._autoServiceScopes) - { - scope = services?.CreateScope(); - services = scope?.ServiceProvider ?? EmptyServiceProvider.Instance; - } + using var scope = InteractionService._autoServiceScopes + ? services.CreateScope() + : null; + + services = (InteractionService._autoServiceScopes + ? scope?.ServiceProvider + : services) ?? EmptyServiceProvider.Instance; var instance = ReflectionUtils.CreateObject(TypeInfo, interactionService, services); @@ -482,12 +483,10 @@ namespace Discord.Interactions.Builders 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/Utilities/EmptyServiceProvider.cs b/src/Discord.Net.Interactions/Utilities/EmptyServiceProvider.cs index 172f11cc..badcbdd3 100644 --- a/src/Discord.Net.Interactions/Utilities/EmptyServiceProvider.cs +++ b/src/Discord.Net.Interactions/Utilities/EmptyServiceProvider.cs @@ -1,11 +1,31 @@ +using Microsoft.Extensions.DependencyInjection; using System; -namespace Discord.Interactions -{ - internal class EmptyServiceProvider : IServiceProvider - { - public static EmptyServiceProvider Instance => new EmptyServiceProvider(); +namespace Discord.Interactions; - public object GetService(Type serviceType) => null; +internal class EmptyServiceProvider : IServiceProvider +{ + public static EmptyServiceProvider Instance => new (); + + public object GetService(Type serviceType) + { + if (serviceType == typeof(IServiceScopeFactory)) + return EmptyServiceScopeFactory.Instance; + + return null; } } + +internal class EmptyServiceScopeFactory : IServiceScopeFactory +{ + public static EmptyServiceScopeFactory Instance => new (); + + public IServiceScope CreateScope() => new EmptyServiceScope(); +} + +internal class EmptyServiceScope : IServiceScope +{ + public IServiceProvider ServiceProvider => EmptyServiceProvider.Instance; + + public void Dispose() { } +}