using Autofac; using SlnMesnac.Repository; using System.Reflection; using TouchSocket.Sockets; #region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2024 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:LAPTOP-E0N2L34V * 命名空间:SlnMesnac.Ioc * 唯一标识:496f8d2b-70e3-4a05-ae18-a9b0fcd06b82 * * 创建者:WenJY * 电子邮箱:wenjy@mesnac.com * 创建时间:2024-03-27 21:58:35 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> namespace SlnMesnac.Ioc { /// /// Utility class for configuring dependency injection. /// public static class DependencyConfigurator { /// /// Configures dependency injection for the application. /// /// The Autofac container builder. public static void Configure(ContainerBuilder builder, string instanceId) { Console.WriteLine($"Configuring dependencies for Instance {instanceId}"); // 为每个实例创建完全独立的注册 builder.RegisterInstance(instanceId).Named("InstanceId"); // 所有注册都使用 InstancePerDependency,确保完全独立 builder.RegisterGeneric(typeof(Repository<>)) .As(typeof(Repository<>)) .InstancePerDependency(); RegisterImplementations(builder, Assembly.LoadFrom("SlnMesnac.Repository.dll"), instanceId); RegisterTypeTransient(builder, Assembly.LoadFrom("SlnMesnac.Plc.dll"), instanceId); RegisterTypeTransient(builder, Assembly.LoadFrom("SlnMesnac.Rfid.dll"), instanceId); RegisterTypeInstancePerDependency(builder, Assembly.LoadFrom("SlnMesnac.Common.dll"), instanceId); RegisterTypeInstancePerDependency(builder, Assembly.LoadFrom("SlnMesnac.Mqtt.dll"), instanceId); builder.RegisterType(typeof(TcpService)).InstancePerDependency(); RegisterTypeInstancePerDependency(builder, Assembly.LoadFrom("SlnMesnac.TouchSocket.dll"), instanceId); RegisterTypeInstancePerDependency(builder, Assembly.LoadFrom("SlnMesnac.Business.dll"), instanceId); RegisterTypeInstancePerDependency(builder, Assembly.LoadFrom("SlnMesnac.Generate.dll"), instanceId); Console.WriteLine($"Dependencies for Instance {instanceId} configured successfully"); } private static void RegisterImplementations(ContainerBuilder builder, Assembly assembly, string instanceId) { var types = assembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract && !t.IsGenericType) .ToList(); foreach (var type in types) { var interfaces = type.GetInterfaces(); foreach (var @interface in interfaces) { // 为每个实例创建独立的注册键 var registrationKey = $"{@interface.FullName}_{instanceId}"; if (!builder.Properties.ContainsKey(registrationKey)) { builder.RegisterType(type).As(@interface).InstancePerDependency(); builder.Properties[registrationKey] = true; } } } } private static void RegisterTypeInstancePerDependency(ContainerBuilder builder, Assembly assembly, string instanceId) { var types = assembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract && !t.IsGenericType) .ToList(); foreach (var type in types) { if (!typeof(Delegate).IsAssignableFrom(type)) { var registrationKey = $"{type.FullName}_{instanceId}"; if (!builder.Properties.ContainsKey(registrationKey)) { builder.RegisterType(type).InstancePerDependency(); builder.Properties[registrationKey] = true; } } } } private static void RegisterTypeTransient(ContainerBuilder builder, Assembly assembly, string instanceId) { var types = assembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract && !t.IsGenericType) .ToList(); foreach (var type in types) { if (!typeof(Delegate).IsAssignableFrom(type)) { var registrationKey = $"{type.FullName}_{instanceId}"; if (!builder.Properties.ContainsKey(registrationKey)) { builder.RegisterType(type).AsSelf().InstancePerDependency(); builder.Properties[registrationKey] = true; } } } } } }