1
0

RegisterModule.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using Autofac;
  2. using Autofac.Extras.DynamicProxy;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Reflection;
  7. using Module = Autofac.Module;
  8. using Microsoft.Extensions.DependencyModel;
  9. using ZhonTai.Admin.Core.Configs;
  10. using ZhonTai.Admin.Core.Db.Transaction;
  11. using ZhonTai.Admin.Core.Attributes;
  12. using ZhonTai.Admin.Core.Repositories;
  13. namespace ZhonTai.Admin.Core.RegisterModules;
  14. public class RegisterModule : Module
  15. {
  16. private readonly AppConfig _appConfig;
  17. /// <summary>
  18. /// 模块注入
  19. /// </summary>
  20. /// <param name="appConfig">AppConfig</param>
  21. public RegisterModule(AppConfig appConfig)
  22. {
  23. _appConfig = appConfig;
  24. }
  25. protected override void Load(ContainerBuilder builder)
  26. {
  27. //事务拦截
  28. var interceptorServiceTypes = new List<Type>();
  29. if (_appConfig.Aop.Transaction)
  30. {
  31. builder.RegisterType<TransactionInterceptor>();
  32. builder.RegisterType<TransactionAsyncInterceptor>();
  33. interceptorServiceTypes.Add(typeof(TransactionInterceptor));
  34. }
  35. if(_appConfig.AssemblyNames?.Length > 0)
  36. {
  37. //程序集
  38. Assembly[] assemblies = DependencyContext.Default.RuntimeLibraries
  39. .Where(a => _appConfig.AssemblyNames.Contains(a.Name))
  40. .Select(o => Assembly.Load(new AssemblyName(o.Name))).ToArray();
  41. var nonRegisterIOCAttribute = typeof(NonRegisterIOCAttribute);
  42. var iRegisterIOCType = typeof(IRegisterIOC);
  43. bool Predicate(Type a) => !a.IsDefined(nonRegisterIOCAttribute, true)
  44. && (a.Name.EndsWith("Service") || a.Name.EndsWith("Repository") || iRegisterIOCType.IsAssignableFrom(a))
  45. && !a.IsAbstract && !a.IsInterface && a.IsPublic;
  46. //有接口实例
  47. builder.RegisterAssemblyTypes(assemblies)
  48. .Where(Predicate)
  49. .AsImplementedInterfaces()
  50. .InstancePerLifetimeScope()
  51. .PropertiesAutowired()// 属性注入
  52. .InterceptedBy(interceptorServiceTypes.ToArray())
  53. .EnableInterfaceInterceptors();
  54. //无接口实例
  55. builder.RegisterAssemblyTypes(assemblies)
  56. .Where(Predicate)
  57. .InstancePerLifetimeScope()
  58. .PropertiesAutowired()// 属性注入
  59. .InterceptedBy(interceptorServiceTypes.ToArray())
  60. .EnableClassInterceptors();
  61. //仓储泛型注入
  62. builder.RegisterGeneric(typeof(RepositoryBase<>)).As(typeof(IRepositoryBase<>)).InstancePerLifetimeScope().PropertiesAutowired();
  63. builder.RegisterGeneric(typeof(RepositoryBase<,>)).As(typeof(IRepositoryBase<,>)).InstancePerLifetimeScope().PropertiesAutowired();
  64. }
  65. }
  66. }