You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
5.2 KiB
C#

1 year ago
using Autofac;
using SlnMesnac.Repository;
using System.Reflection;
using TouchSocket.Sockets;
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2024 WenJY
* CLR4.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)
1 year ago
{
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");
1 year ago
}
private static void RegisterImplementations(ContainerBuilder builder, Assembly assembly, string instanceId)
1 year ago
{
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;
}
1 year ago
}
}
}
private static void RegisterTypeInstancePerDependency(ContainerBuilder builder, Assembly assembly, string instanceId)
1 year ago
{
var types = assembly.GetTypes()
.Where(t => t.IsClass && !t.IsAbstract && !t.IsGenericType)
.ToList();
foreach (var type in types)
{
if (!typeof(Delegate).IsAssignableFrom(type))
1 year ago
{
var registrationKey = $"{type.FullName}_{instanceId}";
if (!builder.Properties.ContainsKey(registrationKey))
{
builder.RegisterType(type).InstancePerDependency();
builder.Properties[registrationKey] = true;
}
1 year ago
}
}
}
private static void RegisterTypeTransient(ContainerBuilder builder, Assembly assembly, string instanceId)
1 year ago
{
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;
}
1 year ago
}
}
}
}
}