using Autofac;
using Autofac.Extras.DynamicProxy;
using Microsoft.Extensions.DependencyModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.AOP;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_Core.LogHelper;
namespace WIDESEA_Core.Extensions
{
public class AutofacModuleRegister : Autofac.Module
{
///
/// Autofac模块注册类,用于依赖注入配置
///
///
/// 1. 根据配置动态注册日志AOP拦截器
/// 2. 注册泛型仓储和服务基类
/// 3. 扫描项目程序集自动注册实现了IDependency接口的类型
/// 4. 注册工作单元管理器和请求日志模型
///
protected override void Load(ContainerBuilder builder)
{
var basePath = AppContext.BaseDirectory;
var cacheType = new List();
if (AppSettings.Get("LogAopEnable").ObjToBool())
{
builder.RegisterType();
cacheType.Add(typeof(LogAOP));
}
builder.RegisterGeneric(typeof(RepositoryBase<>)).As(typeof(IRepository<>)).InstancePerDependency();//注册仓储
builder.RegisterGeneric(typeof(ServiceBase<,>)).As(typeof(IService<>)).InstancePerDependency();//注册服务
Type baseType = typeof(IDependency);
List compilationLibrary = DependencyContext.Default
.RuntimeLibraries
.Where(x => !x.Serviceable
&& x.Type == "project")
.ToList();
List assemblyList = new List();
foreach (var library in compilationLibrary)
{
try
{
string path = Path.Combine(basePath, $"{library.Name}.dll");
if (!File.Exists(path))
{
var msg = $"{library.Name}.dll丢失,因为项目解耦了,所以需要先F6编译,再F5运行,请检查 bin 文件夹,并拷贝。";
//log.Error(msg);
throw new Exception(msg);
}
assemblyList.Add(Assembly.LoadFrom(path));
}
catch (Exception ex)
{
Console.WriteLine(library.Name + ex.Message);
}
}
builder.RegisterAssemblyTypes(assemblyList.ToArray()).Where(x => !x.IsInterface && !x.IsAbstract && baseType.IsAssignableFrom(x))
.AsImplementedInterfaces()
.PropertiesAutowired()
.InstancePerDependency().
EnableInterfaceInterceptors()
.InterceptedBy(cacheType.ToArray());
builder.RegisterType().As()
.AsImplementedInterfaces()
.InstancePerLifetimeScope()
.PropertiesAutowired();
builder.RegisterType().InstancePerLifetimeScope();
}
}
}