|
|
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
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// Utility class for configuring dependency injection.
|
|
|
/// </summary>
|
|
|
public static class DependencyConfigurator
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// Configures dependency injection for the application.
|
|
|
/// </summary>
|
|
|
/// <param name="builder">The Autofac container builder.</param>
|
|
|
public static void Configure(ContainerBuilder builder, string instanceId)
|
|
|
{
|
|
|
Console.WriteLine($"Configuring dependencies for Instance {instanceId}");
|
|
|
|
|
|
// 为每个实例创建完全独立的注册
|
|
|
builder.RegisterInstance(instanceId).Named<string>("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;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|