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;
}
}
}
}
}
}