| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | using Autofac;using Autofac.Extras.DynamicProxy;using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using Module = Autofac.Module;using Microsoft.Extensions.DependencyModel;using ZhonTai.Admin.Core.Configs;using ZhonTai.Admin.Core.Db.Transaction;using ZhonTai.Admin.Core.Attributes;using ZhonTai.Admin.Core.Repositories;using Microsoft.AspNetCore.Identity;namespace ZhonTai.Admin.Core.RegisterModules;public class RegisterModule : Module{    private readonly AppConfig _appConfig;    /// <summary>    /// 模块注入    /// </summary>    /// <param name="appConfig">AppConfig</param>    public RegisterModule(AppConfig appConfig)    {        _appConfig = appConfig;    }    protected override void Load(ContainerBuilder builder)    {        //事务拦截        var interceptorServiceTypes = new List<Type>();        if (_appConfig.Aop.Transaction)        {            builder.RegisterType<TransactionInterceptor>();            builder.RegisterType<TransactionAsyncInterceptor>();            interceptorServiceTypes.Add(typeof(TransactionInterceptor));        }        if(_appConfig.AssemblyNames?.Length > 0)        {            //程序集            Assembly[] assemblies = DependencyContext.Default.RuntimeLibraries                .Where(a => _appConfig.AssemblyNames.Contains(a.Name))                .Select(o => Assembly.Load(new AssemblyName(o.Name))).ToArray();            var nonRegisterIOCAttribute = typeof(NonRegisterIOCAttribute);            var iRegisterIOCType = typeof(IRegisterIOC);            bool Predicate(Type a) => !a.IsDefined(nonRegisterIOCAttribute, true)                 && (a.Name.EndsWith("Service") || a.Name.EndsWith("Repository") || iRegisterIOCType.IsAssignableFrom(a))                 && !a.IsAbstract && !a.IsInterface && a.IsPublic;            //有接口实例            builder.RegisterAssemblyTypes(assemblies)            .Where(Predicate)            .AsImplementedInterfaces()            .InstancePerLifetimeScope()            .PropertiesAutowired()// 属性注入            .InterceptedBy(interceptorServiceTypes.ToArray())            .EnableInterfaceInterceptors();            //无接口实例            builder.RegisterAssemblyTypes(assemblies)            .Where(Predicate)            .InstancePerLifetimeScope()            .PropertiesAutowired()// 属性注入            .InterceptedBy(interceptorServiceTypes.ToArray())            .EnableClassInterceptors();            if(_appConfig.PasswordHasher)                builder.RegisterGeneric(typeof(PasswordHasher<>)).As(typeof(IPasswordHasher<>)).SingleInstance().PropertiesAutowired();            //仓储泛型注入            builder.RegisterGeneric(typeof(RepositoryBase<>)).As(typeof(IRepositoryBase<>)).InstancePerLifetimeScope().PropertiesAutowired();            builder.RegisterGeneric(typeof(RepositoryBase<,>)).As(typeof(IRepositoryBase<,>)).InstancePerLifetimeScope().PropertiesAutowired();        }    }}
 |