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(); } } }