Add empty service scopes (#3078)

This commit is contained in:
Mihail Gribkov
2025-03-09 21:52:53 +03:00
committed by GitHub
parent 41ad6aceac
commit 54e841694e
2 changed files with 33 additions and 14 deletions

View File

@@ -467,12 +467,13 @@ namespace Discord.Interactions.Builders
{ {
if (TypeInfo is not null && ModuleClassBuilder.IsValidModuleDefinition(TypeInfo)) if (TypeInfo is not null && ModuleClassBuilder.IsValidModuleDefinition(TypeInfo))
{ {
IServiceScope scope = null; using var scope = InteractionService._autoServiceScopes
if (interactionService._autoServiceScopes) ? services.CreateScope()
{ : null;
scope = services?.CreateScope();
services = scope?.ServiceProvider ?? EmptyServiceProvider.Instance; services = (InteractionService._autoServiceScopes
} ? scope?.ServiceProvider
: services) ?? EmptyServiceProvider.Instance;
var instance = ReflectionUtils<IInteractionModuleBase>.CreateObject(TypeInfo, interactionService, services); var instance = ReflectionUtils<IInteractionModuleBase>.CreateObject(TypeInfo, interactionService, services);
@@ -482,12 +483,10 @@ namespace Discord.Interactions.Builders
var moduleInfo = new ModuleInfo(this, interactionService, services, parent); var moduleInfo = new ModuleInfo(this, interactionService, services, parent);
instance.OnModuleBuilding(interactionService, moduleInfo); instance.OnModuleBuilding(interactionService, moduleInfo);
scope?.Dispose();
return moduleInfo; return moduleInfo;
} }
finally finally
{ {
scope?.Dispose();
(instance as IDisposable)?.Dispose(); (instance as IDisposable)?.Dispose();
} }
} }

View File

@@ -1,11 +1,31 @@
using Microsoft.Extensions.DependencyInjection;
using System; using System;
namespace Discord.Interactions namespace Discord.Interactions;
{
internal class EmptyServiceProvider : IServiceProvider
{
public static EmptyServiceProvider Instance => new EmptyServiceProvider();
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() { }
}