pschelpdesk/Vendor/Prise/Core/PluginLoadContextExtensions.cs
2024-11-04 20:45:34 +01:00

142 lines
6.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
namespace Prise
{
public static class PluginLoadContextExtensions
{
public static PluginLoadContext AddHostServices(this PluginLoadContext pluginLoadContext,
IServiceCollection hostServices,
IEnumerable<Type> includeTypes = null,
IEnumerable<Type> excludeTypes = null)
{
if (includeTypes == null || !includeTypes.Any())
return pluginLoadContext; // short circuit
var hostTypes = new List<Type>();
var priseServices = hostServices.Where(s => IsPriseService(s.ServiceType));
var includeServices = hostServices.Where(s => Includes(s.ServiceType, includeTypes));
var excludeServices = hostServices.Where(s => Excludes(s.ServiceType, excludeTypes));
foreach (var hostService in hostServices
.Except(priseServices)
.Union(includeServices)
.Except(excludeServices))
pluginLoadContext.AddHostService(hostService);
return pluginLoadContext;
}
public static PluginLoadContext AddHostService(this PluginLoadContext pluginLoadContext, Type hostServiceType, Type hostServiceImplementationType, ServiceLifetime serviceLifetime = ServiceLifetime.Scoped)
{
return pluginLoadContext.AddHostService(new ServiceDescriptor(hostServiceType, hostServiceImplementationType, serviceLifetime));
}
public static PluginLoadContext AddHostService<T>(this PluginLoadContext pluginLoadContext, T implementation, ServiceLifetime serviceLifetime = ServiceLifetime.Scoped)
{
return pluginLoadContext.AddHostService(new ServiceDescriptor(typeof(T), (s) => implementation, serviceLifetime));
}
public static PluginLoadContext AddHostService(this PluginLoadContext pluginLoadContext, ServiceDescriptor hostService)
{
// Add the Host service to the servicecollection of the plugin
pluginLoadContext.HostServices.Add(hostService);
return pluginLoadContext
// A host type will always live inside the host
.AddHostTypes(new[] { hostService.ServiceType })
// The implementation type will always exist on the Host, since it will be created here
.AddHostTypes(new[] { hostService.ImplementationType ?? hostService.ImplementationInstance?.GetType() ?? hostService.ImplementationFactory?.Method.ReturnType });
}
public static PluginLoadContext AddHostTypes(this PluginLoadContext pluginLoadContext, IEnumerable<Type> hostTypes)
{
if (hostTypes == null || !hostTypes.Any())
return pluginLoadContext; // short circuit
pluginLoadContext.HostTypes = new List<Type>(pluginLoadContext.HostTypes.Union(hostTypes));
return pluginLoadContext;
}
public static PluginLoadContext AddHostAssemblies(this PluginLoadContext pluginLoadContext, IEnumerable<string> assemblies)
{
if (assemblies == null || !assemblies.Any())
return pluginLoadContext; // short circuit
pluginLoadContext.HostAssemblies = new List<string>(pluginLoadContext.HostAssemblies.Union(assemblies));
return pluginLoadContext;
}
public static PluginLoadContext AddRemoteTypes(this PluginLoadContext pluginLoadContext, IEnumerable<Type> remoteTypes)
{
if (remoteTypes == null || !remoteTypes.Any())
return pluginLoadContext; // short circuit
pluginLoadContext.RemoteTypes = new List<Type>(pluginLoadContext.RemoteTypes.Union(remoteTypes));
return pluginLoadContext;
}
public static PluginLoadContext AddDowngradableHostTypes(this PluginLoadContext pluginLoadContext, IEnumerable<Type> downgradableHostTypes)
{
if (downgradableHostTypes == null || !downgradableHostTypes.Any())
return pluginLoadContext; // short circuit
pluginLoadContext.DowngradableHostTypes = new List<Type>(pluginLoadContext.DowngradableHostTypes.Union(downgradableHostTypes));
return pluginLoadContext;
}
public static PluginLoadContext AddDowngradableHostAssemblies(this PluginLoadContext pluginLoadContext, IEnumerable<string> assemblies)
{
if (assemblies == null || !assemblies.Any())
return pluginLoadContext; // short circuit
pluginLoadContext.DowngradableHostAssemblies = new List<string>(pluginLoadContext.DowngradableHostAssemblies.Union(assemblies));
return pluginLoadContext;
}
public static PluginLoadContext AddAdditionalProbingPaths(this PluginLoadContext pluginLoadContext, IEnumerable<string> additionalProbingPaths)
{
if (additionalProbingPaths == null || !additionalProbingPaths.Any())
return pluginLoadContext; // short circuit
pluginLoadContext.AdditionalProbingPaths = new List<string>(pluginLoadContext.AdditionalProbingPaths.Union(additionalProbingPaths));
return pluginLoadContext;
}
public static PluginLoadContext SetNativeDependencyLoadPreference(this PluginLoadContext pluginLoadContext, NativeDependencyLoadPreference nativeDependencyLoadPreference)
{
pluginLoadContext.NativeDependencyLoadPreference = nativeDependencyLoadPreference;
return pluginLoadContext;
}
public static PluginLoadContext SetPlatformVersion(this PluginLoadContext pluginLoadContext, PluginPlatformVersion pluginPlatformVersion)
{
pluginLoadContext.PluginPlatformVersion = pluginPlatformVersion;
return pluginLoadContext;
}
public static PluginLoadContext SetRuntimePlatformContext(this PluginLoadContext pluginLoadContext, IRuntimePlatformContext runtimePlatformContext)
{
pluginLoadContext.RuntimePlatformContext = runtimePlatformContext;
return pluginLoadContext;
}
private static bool IsPriseService(Type type) => type.Namespace.StartsWith("Prise.");
private static bool Includes(Type type, IEnumerable<Type> includeTypes)
{
if (includeTypes == null)
return true;
return includeTypes.Contains(type);
}
private static bool Excludes(Type type, IEnumerable<Type> excludeTypes)
{
if (excludeTypes == null)
return false;
return excludeTypes.Contains(type);
}
}
}