z8018
2026-02-11 b8fb68b44c29e4667f6ea5746119413809a60a9e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
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;
 
/// <summary>
/// 自动服务注册器
/// </summary>
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<LoggingInterceptor>();
 
        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);
                }
            }
        }
    }
 
    /// <summary>
    /// 注册服务但不添加拦截器(用于 LoggerService 等基础服务)
    /// </summary>
    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;
        }
    }
}