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>();
|
}
|
|
public static dynamic Resolve(string typeFullName)
|
{
|
return AutoFacContainer.Instance.Resolve(System.Type.GetType(typeFullName, true));
|
}
|
}
|
}
|