using System.Reflection;
using Autofac;
using Autofac.Extras.DynamicProxy;
using Castle.DynamicProxy;
using KH.WMS.Core.AOP;
using KH.WMS.Core.DependencyInjection.ServiceLifetimes;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace KH.WMS.Core.DependencyInjection;
///
/// 自动服务注册器
///
public class ServiceRegistrar : IServiceRegistrar
{
public void Register(ContainerBuilder builder, params Assembly[] assemblies)
{
// 如果没有传入程序集,使用调用程序集
if (assemblies == null || assemblies.Length == 0)
{
assemblies = new[] { Assembly.GetCallingAssembly() };
}
// 注册所有带生命周期标记的服务
RegisterServicesWithLifetime(builder, assemblies);
Console.WriteLine("服务注册完成");
}
private Type[] interceptors = new Type[]
{
typeof(LoggingInterceptor),
};
private void RegisterServicesWithLifetime(ContainerBuilder builder, Assembly[] assemblies)
{
var serviceTypes = new[]
{
typeof(RegisteredServiceAttribute),
typeof(SelfRegisteredServiceAttribute)
};
builder.RegisterType();
foreach (var assembly in assemblies)
{
var types = assembly.GetTypes()
.Where(t => t.IsClass && !t.IsAbstract && !t.IsInterface)
.SelectMany(t => t.GetCustomAttributes(), (t, attr) => new { Type = t, Attribute = attr })
.Where(x => serviceTypes.Contains(x.Attribute.GetType()));
foreach (var item in types)
{
if (item.Type.Name.Contains("LoggerService"))
{
RegisterServiceWithoutInterceptor(builder, item.Type, item.Attribute, assemblies);
continue;
}
var interfaces = item.Type.GetInterfaces();
var serviceType = interfaces.FirstOrDefault() ?? item.Type;
if (item.Attribute is RegisteredServiceAttribute registeredAttr)
{
if (serviceType == item.Type)
{
Console.WriteLine($"类型 {item.Type.Name} 标记为 RegisteredServiceAttribute,但未实现任何接口,建议使用 SelfRegisteredServiceAttribute 进行自注册。");
Console.WriteLine($"继续注册 {item.Type.Name} 为自注册服务。");
RegisterSelfService(builder, item.Type, registeredAttr.Lifetime);
continue;
}
RegisterService(builder, serviceType, item.Type, registeredAttr.Lifetime);
}
else if (item.Attribute is SelfRegisteredServiceAttribute selfRegisteredAttr)
{
RegisterSelfService(builder, item.Type, selfRegisteredAttr.Lifetime);
}
}
}
}
///
/// 注册服务但不添加拦截器(用于 LoggerService 等基础服务)
///
private void RegisterServiceWithoutInterceptor(ContainerBuilder builder, Type implementationType, Attribute attribute, Assembly[] assemblies)
{
if (attribute is RegisteredServiceAttribute registeredAttr)
{
var interfaces = implementationType.GetInterfaces();
var serviceType = interfaces.FirstOrDefault() ?? implementationType;
switch (registeredAttr.Lifetime)
{
case ServiceLifetime.Singleton:
builder.RegisterType(implementationType).As(serviceType).SingleInstance();
Console.WriteLine($"注册 Singleton 服务(无拦截器): {serviceType.Name}");
break;
case ServiceLifetime.Scoped:
builder.RegisterType(implementationType).As(serviceType).InstancePerLifetimeScope();
Console.WriteLine($"注册 Scoped 服务(无拦截器): {serviceType.Name}");
break;
case ServiceLifetime.Transient:
builder.RegisterType(implementationType).As(serviceType).InstancePerDependency();
Console.WriteLine($"注册 Transient 服务(无拦截器): {serviceType.Name}");
break;
}
}
else if (attribute is SelfRegisteredServiceAttribute selfRegisteredAttr)
{
switch (selfRegisteredAttr.Lifetime)
{
case ServiceLifetime.Singleton:
builder.RegisterType(implementationType).SingleInstance();
Console.WriteLine($"注册自注册 Singleton 服务(无拦截器): {implementationType.Name}");
break;
case ServiceLifetime.Scoped:
builder.RegisterType(implementationType).InstancePerLifetimeScope();
Console.WriteLine($"注册自注册 Scoped 服务(无拦截器): {implementationType.Name}");
break;
case ServiceLifetime.Transient:
builder.RegisterType(implementationType).InstancePerDependency();
Console.WriteLine($"注册自注册 Transient 服务(无拦截器): {implementationType.Name}");
break;
}
}
}
private void RegisterService(ContainerBuilder builder, Type serviceType, Type implementationType, ServiceLifetime lifetime)
{
switch (lifetime)
{
case ServiceLifetime.Singleton:
builder.RegisterType(implementationType).As(serviceType).SingleInstance().EnableInterfaceInterceptors().InterceptedBy(interceptors);
Console.WriteLine($"注册 Singleton 服务: {serviceType.Name}");
break;
case ServiceLifetime.Scoped:
builder.RegisterType(implementationType).As(serviceType).InstancePerLifetimeScope().EnableInterfaceInterceptors().InterceptedBy(interceptors);
Console.WriteLine($"注册 Scoped 服务: {serviceType.Name}");
break;
case ServiceLifetime.Transient:
builder.RegisterType(implementationType).As(serviceType).InstancePerDependency().EnableInterfaceInterceptors().InterceptedBy(interceptors);
Console.WriteLine($"注册 Transient 服务: {serviceType.Name}");
break;
}
}
private void RegisterSelfService(ContainerBuilder builder, Type implementationType, ServiceLifetime lifetime)
{
switch (lifetime)
{
case ServiceLifetime.Singleton:
builder.RegisterType(implementationType).SingleInstance().EnableClassInterceptors().InterceptedBy(interceptors);
Console.WriteLine($"注册自注册 Singleton 服务: {implementationType.Name}");
break;
case ServiceLifetime.Scoped:
builder.RegisterType(implementationType).InstancePerLifetimeScope().EnableClassInterceptors().InterceptedBy(interceptors);
Console.WriteLine($"注册自注册 Scoped 服务: {implementationType.Name}");
break;
case ServiceLifetime.Transient:
builder.RegisterType(implementationType).InstancePerDependency().EnableClassInterceptors().InterceptedBy(interceptors);
Console.WriteLine($"注册自注册 Transient 服务: {implementationType.Name}");
break;
}
}
}