mirror of
https://github.com/jackqqq123/luban_ui_internal.git
synced 2025-11-15 13:48:24 +08:00
80 lines
2.9 KiB
C#
80 lines
2.9 KiB
C#
|
|
using LubanHub.Core.Attributes;
|
|||
|
|
using Microsoft.Extensions.DependencyInjection;
|
|||
|
|
using System;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Net.Http;
|
|||
|
|
using System.Reflection;
|
|||
|
|
|
|||
|
|
namespace LubanHub.Core;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Core服务依赖注入扩展
|
|||
|
|
/// </summary>
|
|||
|
|
public static class ServiceCollectionExtensions
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 添加Core服务 - 通过反射自动发现并注册带有RegistService特性的服务
|
|||
|
|
/// </summary>
|
|||
|
|
public static IServiceCollection AddCoreServices(this IServiceCollection services)
|
|||
|
|
{
|
|||
|
|
// 注册HttpClient(Core服务的依赖)
|
|||
|
|
services.AddSingleton<HttpClient>();
|
|||
|
|
|
|||
|
|
// 获取当前程序集
|
|||
|
|
var assembly = Assembly.GetExecutingAssembly();
|
|||
|
|
|
|||
|
|
// 发现所有带有RegistService特性的类型
|
|||
|
|
var serviceTypes = assembly.GetTypes()
|
|||
|
|
.Where(type => type.IsClass && !type.IsAbstract && type.GetCustomAttribute<RegistServiceAttribute>() != null)
|
|||
|
|
.Select(type => new
|
|||
|
|
{
|
|||
|
|
Type = type,
|
|||
|
|
Attribute = type.GetCustomAttribute<RegistServiceAttribute>()!
|
|||
|
|
})
|
|||
|
|
.OrderBy(x => x.Attribute.Priority) // 按优先级排序
|
|||
|
|
.ToList();
|
|||
|
|
|
|||
|
|
// 注册服务
|
|||
|
|
foreach (var serviceInfo in serviceTypes)
|
|||
|
|
{
|
|||
|
|
var implementationType = serviceInfo.Type;
|
|||
|
|
var attribute = serviceInfo.Attribute;
|
|||
|
|
|
|||
|
|
// 确定服务接口类型
|
|||
|
|
Type serviceType;
|
|||
|
|
if (attribute.ServiceType != null)
|
|||
|
|
{
|
|||
|
|
// 使用特性指定的服务类型
|
|||
|
|
serviceType = attribute.ServiceType;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 自动推断:查找实现的第一个接口
|
|||
|
|
var interfaceType = implementationType.GetInterfaces().FirstOrDefault();
|
|||
|
|
if (interfaceType == null)
|
|||
|
|
{
|
|||
|
|
throw new InvalidOperationException($"服务 {implementationType.Name} 没有实现任何接口,且未在RegistService特性中指定ServiceType");
|
|||
|
|
}
|
|||
|
|
serviceType = interfaceType;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 根据生命周期注册服务
|
|||
|
|
switch (attribute.Lifetime)
|
|||
|
|
{
|
|||
|
|
case ServiceLifetime.Singleton:
|
|||
|
|
services.AddSingleton(serviceType, implementationType);
|
|||
|
|
break;
|
|||
|
|
case ServiceLifetime.Scoped:
|
|||
|
|
services.AddScoped(serviceType, implementationType);
|
|||
|
|
break;
|
|||
|
|
case ServiceLifetime.Transient:
|
|||
|
|
services.AddTransient(serviceType, implementationType);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
throw new ArgumentOutOfRangeException(nameof(attribute.Lifetime), attribute.Lifetime, "不支持的服务生命周期");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return services;
|
|||
|
|
}
|
|||
|
|
}
|