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
{
///
/// AutoFac容器类
///
public static class AutoFacContainer
{
///
/// 容器
///
public static IContainer Instance;
public static AppDomain AppDomain;
///
/// 初始化容器
///
///
public static void Init(ContainerBuilder builder)
{
//新建容器构建器,用于注册组件和服务
Build(builder);
}
///
/// AutoFac 配置文件注入
///
///
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 assemblies = new List();
//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 assemblies = new List();
//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().As().InstancePerLifetimeScope();
//利用构建器创建容器
//Instance = builder.Build();
}
}
///
/// DI公用方法
///
public static class DI
{
public static T Resolve() where T : notnull
{
return AutoFacContainer.Instance.Resolve();
}
public static dynamic Resolve(string typeFullName)
{
return AutoFacContainer.Instance.Resolve(System.Type.GetType(typeFullName, true));
}
}
}