服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2024-10-24 38bde3e8210c41e9d0d219daba0c075cd676efce
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
using Autofac;
using Autofac.Configuration;
using Microsoft.Extensions.Configuration.Json;
using Microsoft.Extensions.Configuration;
using Tiger.IBusiness;
using System.Reflection;
using System.IO;
using System;
using Rhea.Common;
using System.Text.RegularExpressions;
using System.Linq;
using System.Collections.Generic;
 
namespace Tiger.Api
{
    /// <summary>
    /// AutoFac容器类
    /// </summary>
    public static class AutoFacContainer
    {
        /// <summary>
        /// 容器
        /// </summary>
        public static IContainer Instance;
        public static AppDomain AppDomain;
 
        /// <summary>
        /// 初始化容器
        /// </summary>
        /// <returns></returns>
        public static void Init(ContainerBuilder builder)
        {
            //新建容器构建器,用于注册组件和服务
            Build(builder);
        }
 
        /// <summary>
        /// AutoFac 配置文件注入
        /// </summary>
        /// <param name="builder"></param>
        public static void Build(ContainerBuilder builder)
        {
            ////注入Tiger.Business.dll
            //var assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "Tiger.Business.dll");
            //builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();
 
            #region 动态加载多个dll
            string[] assemblyPattern = new[] { "Tiger.Business([.].*)*.dll" };
 
            //AppDomain = AppDomain.CreateDomain("AutoFac Dll");
            //List<Assembly> assemblies = new List<Assembly>();
            //foreach (var file in Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll", SearchOption.AllDirectories).Where(filename => assemblyPattern.Any(pattern => Regex.IsMatch(filename, pattern))))
            //{
            //    var assembly = AppDomain.Load(Assembly.LoadFrom(file).GetName());
            //    assemblies.Add(assembly);
            //}
 
            // 1. Scan for assemblies containing autofac modules in the bin folder
            //List<Assembly> assemblies = new List<Assembly>();
            //assemblies.AddRange(
            //    Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll", SearchOption.AllDirectories)
            //                  .Where(filename => assemblyPattern.Any(pattern => Regex.IsMatch(filename, pattern)))
            //                  .Select(Assembly.LoadFrom)
            //);
 
 
            var assemblies = PluginManager.Load(AppDomain.CurrentDomain.BaseDirectory, "Tiger.Business([.].*)*.dll");
            foreach (var assembly in assemblies)
            {
                builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();
            }
            #endregion
 
            //读取配置文件,把配置关系装载到ContainerBuilder
            var rootPath = new DirectoryInfo($"{AppDomain.CurrentDomain.BaseDirectory}Autofac");
            if (rootPath.Exists)
            {
                var files = rootPath.GetFiles("*.json", SearchOption.AllDirectories);
                foreach (var file in files)
                {
                    IConfigurationBuilder config = new ConfigurationBuilder();
                    IConfigurationSource autofacJsonConfigSource = new JsonConfigurationSource()
                    {
                        Path = file.FullName.Replace(AppDomain.CurrentDomain.BaseDirectory, ""),
                        Optional = false,//boolean,默认就是false,可不写
                        ReloadOnChange = true,//同上
                    };
                    config.Add(autofacJsonConfigSource);
                    ConfigurationModule module = new ConfigurationModule(config.Build());
                    builder.RegisterModule(module);
                }
            }
 
            //builder.RegisterType<TestService>().As<ITest>().InstancePerLifetimeScope(); 
 
            //利用构建器创建容器
            //Instance = builder.Build();
        }
    }
 
    /// <summary>
    /// DI公用方法
    /// </summary>
    public static class DI
    {
        public static T Resolve<T>() where T : notnull
        {
            return AutoFacContainer.Instance.Resolve<T>();
        }
    }
}