fix: scoped services must register their dependencies with PluginManager to ensure the backing services are kept alive long enough

This commit is contained in:
goat 2023-09-29 20:47:54 +02:00
parent e9e234b340
commit 4b9de31240
No known key found for this signature in database
GPG key ID: 49E2AA8C6A76498B
3 changed files with 72 additions and 33 deletions

View file

@ -145,12 +145,12 @@ internal static class ServiceManager
if (serviceKind is ServiceKind.None)
continue;
// Scoped service do not go through Service<T>, so we must let ServiceContainer know what their interfaces map to
if (serviceKind is ServiceKind.ScopedService)
{
serviceContainer.RegisterInterfaces(serviceType);
// Let IoC know about the interfaces this service implements
serviceContainer.RegisterInterfaces(serviceType);
// Scoped service do not go through Service<T> and are never early loaded
if (serviceKind.HasFlag(ServiceKind.ScopedService))
continue;
}
Debug.Assert(
!serviceKind.HasFlag(ServiceKind.ManualService) && !serviceKind.HasFlag(ServiceKind.ScopedService),
@ -176,15 +176,10 @@ internal static class ServiceManager
earlyLoadingServices.Add(serviceType);
}
dependencyServicesMap[serviceType] =
(List<Type>)typeof(Service<>)
.MakeGenericType(serviceType)
.InvokeMember(
"GetDependencyServices",
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
null,
null,
null);
var typeAsServiceT = ServiceHelpers.GetAsService(serviceType);
dependencyServicesMap[serviceType] = ServiceHelpers.GetDependencies(typeAsServiceT)
.Select(x => typeof(Service<>).MakeGenericType(x))
.ToList();
}
_ = Task.Run(async () =>
@ -327,16 +322,8 @@ internal static class ServiceManager
Log.Verbose("Calling GetDependencyServices for '{ServiceName}'", serviceType.FullName!);
dependencyServicesMap[serviceType] =
((List<Type>)typeof(Service<>)
.MakeGenericType(serviceType)
.InvokeMember(
"GetDependencyServices",
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
null,
null,
null))!
.Select(x => x.GetGenericArguments()[0]).ToList();
var typeAsServiceT = ServiceHelpers.GetAsService(serviceType);
dependencyServicesMap[serviceType] = ServiceHelpers.GetDependencies(typeAsServiceT);
allToUnload.Add(serviceType);
}