using Autofac; using Autofac.Extras.DynamicProxy; using Infrastructure.Abstructions; using Infrastructure.Application; using Infrastructure.Domain; using Microsoft.Extensions.DependencyModel; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.Loader; using System.Text; namespace Infrastructure.AutofacInjection { public class AutofacModule: Autofac.Module { protected override void Load(ContainerBuilder builder) { var assemblies = GetCompilationLibraries(builder); InjectDomainService(builder, assemblies); InjectApplicationService(builder, assemblies); InjectServices(builder, assemblies); } private void InjectServices(ContainerBuilder builder, List assemblyList) { builder.RegisterAssemblyTypes(assemblyList.ToArray()) .Where(type => typeof(ITransientDependency).IsAssignableFrom(type) && !type.IsAbstract) .AsImplementedInterfaces() .AsSelf() .InstancePerDependency(); builder.RegisterAssemblyTypes(assemblyList.ToArray()) .Where(type => typeof(IScopedDependency).IsAssignableFrom(type) && !type.IsAbstract) .AsImplementedInterfaces() .AsSelf() .InstancePerLifetimeScope(); builder.RegisterAssemblyTypes(assemblyList.ToArray()) .Where(type => typeof(ISingletonDependency).IsAssignableFrom(type) && !type.IsAbstract) .AsImplementedInterfaces() .AsSelf() .SingleInstance(); } private void InjectApplicationService(ContainerBuilder builder, List assemblyList) { //单独注册appservice是为了启用属性注入 builder.RegisterAssemblyTypes(assemblyList.ToArray()) .Where(type => typeof(IApplicationService).IsAssignableFrom(type) && !type.IsAbstract) .AsImplementedInterfaces() .EnableInterfaceInterceptors() .PropertiesAutowired() .InstancePerDependency(); builder.RegisterAssemblyTypes(assemblyList.ToArray()) .Where(type => typeof(ApplicationService).IsAssignableFrom(type) && !type.IsAbstract) .AsSelf() .EnableClassInterceptors() .PropertiesAutowired() .InstancePerDependency(); } private void InjectDomainService(ContainerBuilder builder, List assemblyList) { //单独注册领域服务是为了开启领域服务的业务编织和属性注入 builder.RegisterAssemblyTypes(assemblyList.ToArray()) .Where(type => typeof(IDomainService).IsAssignableFrom(type) && !type.IsAbstract) .AsImplementedInterfaces() .EnableInterfaceInterceptors() .PropertiesAutowired() .InstancePerDependency(); builder.RegisterAssemblyTypes(assemblyList.ToArray()) .Where(type => typeof(DomainService).IsAssignableFrom(type) && !type.IsAbstract) .AsSelf() .EnableClassInterceptors() .PropertiesAutowired() .InstancePerDependency(); } private List GetCompilationLibraries(ContainerBuilder builder) { var compilationLibrary = DependencyContext.Default .CompileLibraries .Where(x => !x.Serviceable && x.Type == "project") .ToList(); List assemblyList = new List(); foreach (var _compilation in compilationLibrary) { try { assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name))); } catch (Exception ex) { Console.WriteLine(_compilation.Name + ex.Message); } } return assemblyList; } } }