2024-10-25 19:11:43 +08:00
|
|
|
|
using JiShe.CollectBus.Common.Extensions.DependencyInjections;
|
2024-10-08 14:41:41 +08:00
|
|
|
|
using JiShe.CollectBus.Protocol.Contracts.Attributes;
|
2024-10-25 19:11:43 +08:00
|
|
|
|
using System.Reflection;
|
2024-10-28 16:23:39 +08:00
|
|
|
|
using JiShe.CollectBus.Common.Interfaces;
|
2024-09-30 17:53:14 +08:00
|
|
|
|
using TouchSocket.Core;
|
2024-10-28 16:23:39 +08:00
|
|
|
|
using Microsoft.Extensions.Hosting;
|
|
|
|
|
|
using System;
|
2024-09-30 17:53:14 +08:00
|
|
|
|
|
2024-10-11 11:27:57 +08:00
|
|
|
|
// ReSharper disable once CheckNamespace
|
2024-09-30 17:53:14 +08:00
|
|
|
|
namespace Microsoft.Extensions.DependencyInjection
|
|
|
|
|
|
{
|
|
|
|
|
|
public static class DependencyInjectionExtensions
|
|
|
|
|
|
{
|
2024-10-28 16:23:39 +08:00
|
|
|
|
public static void ModuleRegister(this IServiceCollection services, HostBuilderContext hostContext)
|
|
|
|
|
|
{
|
|
|
|
|
|
var assemblies = GetBinAssemblies();
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var assembly in assemblies)
|
|
|
|
|
|
{
|
|
|
|
|
|
var allTypes = assembly.GetTypes();
|
|
|
|
|
|
foreach (var type in allTypes)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (typeof(IJiSheModule).IsAssignableFrom(type) && type is { IsClass: true, IsAbstract: false })
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
var instance = Activator.CreateInstance(type);
|
|
|
|
|
|
_ = (type.GetMethod("ConfigureServices")?.Invoke(instance, [services, hostContext]));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-25 19:11:43 +08:00
|
|
|
|
public static void ServiceRegister(this IServiceCollection services)
|
2024-09-30 17:53:14 +08:00
|
|
|
|
{
|
2024-10-25 19:11:43 +08:00
|
|
|
|
var assemblies = GetBinAssemblies();
|
2024-09-30 17:53:14 +08:00
|
|
|
|
|
|
|
|
|
|
foreach (var assembly in assemblies)
|
|
|
|
|
|
{
|
|
|
|
|
|
var allTypes = assembly.GetTypes();
|
2024-10-25 19:11:43 +08:00
|
|
|
|
foreach (var type in allTypes)
|
|
|
|
|
|
{
|
2024-10-28 16:23:39 +08:00
|
|
|
|
if (type is not { IsClass: true, IsAbstract: false }) continue;
|
|
|
|
|
|
if (typeof(ISingletonDependency).IsAssignableFrom(type))
|
2024-10-25 19:11:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("ISingletonDependency"));
|
|
|
|
|
|
foreach (var interfaceType in interfaceTypes)
|
|
|
|
|
|
{
|
2024-10-26 22:27:19 +08:00
|
|
|
|
services.AddSingleton(interfaceType, type);
|
2024-10-25 19:11:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-28 16:23:39 +08:00
|
|
|
|
if (typeof(ITransientDependency).IsAssignableFrom(type))
|
2024-09-30 17:53:14 +08:00
|
|
|
|
{
|
|
|
|
|
|
var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("ITransientDependency"));
|
|
|
|
|
|
foreach (var interfaceType in interfaceTypes)
|
|
|
|
|
|
{
|
2024-10-26 22:27:19 +08:00
|
|
|
|
services.AddTransient(interfaceType, type);
|
2024-09-30 17:53:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-28 16:23:39 +08:00
|
|
|
|
if (typeof(IScopedDependency).IsAssignableFrom(type))
|
2024-10-25 19:11:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("IScopedDependency"));
|
|
|
|
|
|
foreach (var interfaceType in interfaceTypes)
|
|
|
|
|
|
{
|
2024-10-26 22:27:19 +08:00
|
|
|
|
services.AddScoped(interfaceType, type);
|
2024-10-25 19:11:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static void PluginServiceRegister(this IServiceCollection services, string pluginPath = "")
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pluginPath.IsNullOrWhiteSpace())
|
|
|
|
|
|
{
|
|
|
|
|
|
pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
|
|
|
|
|
|
}
|
|
|
|
|
|
var assemblies = GetAssembliesFromFolder(pluginPath);
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var assembly in assemblies)
|
|
|
|
|
|
{
|
|
|
|
|
|
var allTypes = assembly.GetTypes();
|
2024-09-30 17:53:14 +08:00
|
|
|
|
foreach (var type in allTypes)
|
|
|
|
|
|
{
|
2024-10-08 14:41:41 +08:00
|
|
|
|
if (typeof(ISingletonDependency).IsAssignableFrom(type) && type is { IsClass: true, IsAbstract: false })
|
2024-09-30 17:53:14 +08:00
|
|
|
|
{
|
|
|
|
|
|
var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("ISingletonDependency"));
|
|
|
|
|
|
foreach (var interfaceType in interfaceTypes)
|
|
|
|
|
|
{
|
2024-10-08 14:41:41 +08:00
|
|
|
|
var attr = type.GetCustomAttribute<ProtocolNameAttribute>();
|
|
|
|
|
|
if (attr == null) continue;
|
|
|
|
|
|
var serviceDescriptor = new ServiceDescriptor(interfaceType, attr.Name, type, ServiceLifetime.Singleton);
|
|
|
|
|
|
services.Add(serviceDescriptor);
|
2024-09-30 17:53:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-25 19:11:43 +08:00
|
|
|
|
if (typeof(ITransientDependency).IsAssignableFrom(type) && type is { IsClass: true, IsAbstract: false })
|
|
|
|
|
|
{
|
|
|
|
|
|
var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("ITransientDependency"));
|
|
|
|
|
|
foreach (var interfaceType in interfaceTypes)
|
|
|
|
|
|
{
|
|
|
|
|
|
var attr = type.GetCustomAttribute<ProtocolNameAttribute>();
|
|
|
|
|
|
if (attr == null) continue;
|
|
|
|
|
|
var serviceDescriptor = new ServiceDescriptor(interfaceType, attr.Name, type, ServiceLifetime.Transient);
|
|
|
|
|
|
services.Add(serviceDescriptor);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-08 14:41:41 +08:00
|
|
|
|
if (typeof(IScopedDependency).IsAssignableFrom(type) && type is { IsClass: true, IsAbstract: false })
|
2024-09-30 17:53:14 +08:00
|
|
|
|
{
|
|
|
|
|
|
var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("IScopedDependency"));
|
|
|
|
|
|
foreach (var interfaceType in interfaceTypes)
|
|
|
|
|
|
{
|
2024-10-08 14:41:41 +08:00
|
|
|
|
var attr = type.GetCustomAttribute<ProtocolNameAttribute>();
|
|
|
|
|
|
if (attr == null) continue;
|
|
|
|
|
|
var serviceDescriptor = new ServiceDescriptor(interfaceType, attr.Name, type, ServiceLifetime.Scoped);
|
|
|
|
|
|
services.Add(serviceDescriptor);
|
2024-09-30 17:53:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-25 19:11:43 +08:00
|
|
|
|
private static IEnumerable<Assembly> GetAssembliesFromFolder(string folderPath)
|
2024-09-30 17:53:14 +08:00
|
|
|
|
{
|
2024-10-25 19:11:43 +08:00
|
|
|
|
var directory = new DirectoryInfo(folderPath);
|
|
|
|
|
|
if (!directory.Exists) return [];
|
|
|
|
|
|
|
|
|
|
|
|
var files = directory.GetFiles("*.dll");
|
|
|
|
|
|
|
|
|
|
|
|
var assemblies = new List<Assembly>();
|
|
|
|
|
|
foreach (var file in files)
|
2024-09-30 17:53:14 +08:00
|
|
|
|
{
|
2024-10-25 19:11:43 +08:00
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
var assembly = Assembly.LoadFrom(file.FullName);
|
|
|
|
|
|
assemblies.Add(assembly);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Console.WriteLine($"Error loading assembly from {file.FullName}: {ex.Message}");
|
|
|
|
|
|
}
|
2024-09-30 17:53:14 +08:00
|
|
|
|
}
|
2024-10-25 19:11:43 +08:00
|
|
|
|
|
|
|
|
|
|
return assemblies;
|
2024-09-30 17:53:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-25 19:11:43 +08:00
|
|
|
|
private static IEnumerable<Assembly> GetBinAssemblies()
|
2024-09-30 17:53:14 +08:00
|
|
|
|
{
|
2024-10-25 19:11:43 +08:00
|
|
|
|
var directory = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
|
|
|
|
|
|
if (!directory.Exists) return [];
|
2024-09-30 23:30:03 +08:00
|
|
|
|
|
2024-10-25 19:11:43 +08:00
|
|
|
|
var files = directory.GetFiles("JiShe.CollectBus.*.dll");
|
2024-09-30 17:53:14 +08:00
|
|
|
|
|
|
|
|
|
|
var assemblies = new List<Assembly>();
|
|
|
|
|
|
foreach (var file in files)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
var assembly = Assembly.LoadFrom(file.FullName);
|
|
|
|
|
|
assemblies.Add(assembly);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Console.WriteLine($"Error loading assembly from {file.FullName}: {ex.Message}");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return assemblies;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|