1
0
Selaa lähdekoodia

新增单例注入、仓储注入、服务注入模块

zhontai 3 vuotta sitten
vanhempi
commit
07c5049e6c

+ 1 - 0
Admin.Core/Admin.Core.csproj

@@ -50,6 +50,7 @@
     <PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.9" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.9" />
+    <PackageReference Include="Microsoft.Extensions.DependencyModel" Version="5.0.0" />
     <PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />   
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.1" />
   </ItemGroup>

+ 21 - 0
Admin.Core/Admin.Core.xml

@@ -1086,5 +1086,26 @@
             操作日志处理
             </summary>
         </member>
+        <member name="M:Admin.Core.RegisterModules.RepositoryModule.#ctor(System.String,System.String)">
+            <summary>
+            仓储注入
+            </summary>
+            <param name="assemblyName">程序集名称</param>
+            <param name="suffixName">后缀名</param>
+        </member>
+        <member name="M:Admin.Core.RegisterModules.ServiceModule.#ctor(Admin.Core.Common.Configs.AppConfig,System.String,System.String)">
+            <summary>
+            服务注入
+            </summary>
+            <param name="appConfig">AppConfig</param>
+            <param name="assemblyName">程序集名称</param>
+            <param name="suffixName">后缀名</param>
+        </member>
+        <member name="M:Admin.Core.RegisterModules.SingleInstanceModule.#ctor(System.String)">
+            <summary>
+            单例注入
+            </summary>
+            <param name="prefixName">前缀名</param>
+        </member>
     </members>
 </doc>

+ 41 - 0
Admin.Core/RegisterModules/RepositoryModule.cs

@@ -0,0 +1,41 @@
+
+using Admin.Core.Repository;
+using Autofac;
+using System.Linq;
+using System.Reflection;
+using Module = Autofac.Module;
+
+namespace Admin.Core.RegisterModules
+{
+    public class RepositoryModule : Module
+    {
+        private readonly string _assemblyName;
+        private readonly string _suffixName;
+
+        /// <summary>
+        /// 仓储注入
+        /// </summary>
+        /// <param name="assemblyName">程序集名称</param>
+        /// <param name="suffixName">后缀名</param>
+        public RepositoryModule(string assemblyName = "Admin.Core.Repository", string suffixName = "Repository")
+        {
+            _assemblyName = assemblyName;
+            _suffixName = suffixName;
+        }
+
+        protected override void Load(ContainerBuilder builder)
+        {
+            //仓储
+            var assemblyRepository = Assembly.Load(_assemblyName);
+            builder.RegisterAssemblyTypes(assemblyRepository)
+            .Where(a => a.Name.EndsWith(_suffixName))
+            .AsImplementedInterfaces()
+            .InstancePerLifetimeScope()
+            .PropertiesAutowired();// 属性注入
+
+            //泛型注入
+            builder.RegisterGeneric(typeof(RepositoryBase<>)).As(typeof(IRepositoryBase<>)).InstancePerLifetimeScope();
+            builder.RegisterGeneric(typeof(RepositoryBase<,>)).As(typeof(IRepositoryBase<,>)).InstancePerLifetimeScope();
+        }
+    }
+}

+ 56 - 0
Admin.Core/RegisterModules/ServiceModule.cs

@@ -0,0 +1,56 @@
+
+using Admin.Core.Aop;
+using Admin.Core.Common.Configs;
+using Admin.Core.Repository;
+using Autofac;
+using Autofac.Extras.DynamicProxy;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using Module = Autofac.Module;
+
+namespace Admin.Core.RegisterModules
+{
+    public class ServiceModule : Module
+    {
+        private readonly AppConfig _appConfig;
+        private readonly string _assemblyName;
+        private readonly string _suffixName;
+
+        /// <summary>
+        /// 服务注入
+        /// </summary>
+        /// <param name="appConfig">AppConfig</param>
+        /// <param name="assemblyName">程序集名称</param>
+        /// <param name="suffixName">后缀名</param>
+        public ServiceModule(AppConfig appConfig, string assemblyName = "Admin.Core.Service", string suffixName = "Service")
+        {
+            _appConfig = appConfig;
+            _assemblyName = assemblyName;
+            _suffixName = suffixName;
+        }
+
+        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));
+            }
+
+            //服务
+            var assemblyServices = Assembly.Load(_assemblyName);
+            builder.RegisterAssemblyTypes(assemblyServices)
+            .Where(a => a.Name.EndsWith(_suffixName))
+            .AsImplementedInterfaces()
+            .InstancePerLifetimeScope()
+            .PropertiesAutowired()// 属性注入
+            .InterceptedBy(interceptorServiceTypes.ToArray())
+            .EnableInterfaceInterceptors();
+        }
+    }
+}

+ 39 - 0
Admin.Core/RegisterModules/SingleInstanceModule.cs

@@ -0,0 +1,39 @@
+
+using Admin.Core.Common.Attributes;
+using Autofac;
+using Microsoft.Extensions.DependencyModel;
+using System.Linq;
+using System.Reflection;
+using Module = Autofac.Module;
+
+namespace Admin.Core.RegisterModules
+{
+    public class SingleInstanceModule : Module
+    {
+        private readonly string _prefixName;
+
+        /// <summary>
+        /// 单例注入
+        /// </summary>
+        /// <param name="prefixName">前缀名</param>
+        public SingleInstanceModule(string prefixName = "Admin.")
+        {
+            _prefixName = prefixName;
+        }
+
+        protected override void Load(ContainerBuilder builder)
+        {
+            //无接口注入单例
+            Assembly[] assemblies = DependencyContext.Default.RuntimeLibraries.Where(a => a.Name.StartsWith(_prefixName)).Select(o => Assembly.Load(new AssemblyName(o.Name))).ToArray();
+            builder.RegisterAssemblyTypes(assemblies)
+            .Where(t => t.GetCustomAttribute<SingleInstanceAttribute>() != null)
+            .SingleInstance();
+
+            //有接口注入单例
+            builder.RegisterAssemblyTypes(assemblies)
+            .Where(t => t.GetCustomAttribute<SingleInstanceAttribute>() != null)
+            .AsImplementedInterfaces()
+            .SingleInstance();
+        }
+    }
+}

+ 8 - 53
Admin.Core/Startup.cs

@@ -1,6 +1,5 @@
 using Admin.Core.Aop;
 using Admin.Core.Auth;
-using Admin.Core.Common.Attributes;
 using Admin.Core.Common.Auth;
 using Admin.Core.Common.Cache;
 using Admin.Core.Common.Configs;
@@ -14,6 +13,7 @@ using Admin.Core.Enums;
 using Admin.Core.Extensions;
 using Admin.Core.Filters;
 using Admin.Core.Logs;
+using Admin.Core.RegisterModules;
 using Admin.Core.Repository;
 using AspNetCoreRateLimit;
 using Autofac;
@@ -65,6 +65,7 @@ namespace Admin.Core
             //雪花漂移算法
             YitIdHelper.SetIdGenerator(new IdGeneratorOptions(1) { WorkerIdBitLength = 6 });
 
+            //权限处理
             services.AddScoped<IPermissionHandler, PermissionHandler>();
 
             // ClaimType不被更改
@@ -383,60 +384,14 @@ namespace Admin.Core
 
             try
             {
-                #region SingleInstance
+                // 单例注入
+                builder.RegisterModule(new SingleInstanceModule());
 
-                //无接口注入单例
-                var assemblyCore = Assembly.Load("Admin.Core");
-                var assemblyCommon = Assembly.Load("Admin.Core.Common");
-                var assemblyTools = Assembly.Load("Admin.Tools");
-                builder.RegisterAssemblyTypes(assemblyCore, assemblyCommon, assemblyTools)
-                .Where(t => t.GetCustomAttribute<SingleInstanceAttribute>() != null)
-                .SingleInstance();
+                // 仓储注入
+                builder.RegisterModule(new RepositoryModule());
 
-                //有接口注入单例
-                builder.RegisterAssemblyTypes(assemblyCore, assemblyCommon, assemblyTools)
-                .Where(t => t.GetCustomAttribute<SingleInstanceAttribute>() != null)
-                .AsImplementedInterfaces()
-                .SingleInstance();
-
-                #endregion SingleInstance
-
-                #region Aop
-
-                var interceptorServiceTypes = new List<Type>();
-                if (_appConfig.Aop.Transaction)
-                {
-                    builder.RegisterType<TransactionInterceptor>();
-                    builder.RegisterType<TransactionAsyncInterceptor>();
-                    interceptorServiceTypes.Add(typeof(TransactionInterceptor));
-                }
-
-                #endregion Aop
-
-                #region Repository
-                var assemblyRepository = Assembly.Load("Admin.Core.Repository");
-                builder.RegisterAssemblyTypes(assemblyRepository)
-                .AsImplementedInterfaces()
-                .InstancePerLifetimeScope()
-                .PropertiesAutowired();// 属性注入
-
-
-                //泛型注入
-                builder.RegisterGeneric(typeof(RepositoryBase<>)).As(typeof(IRepositoryBase<>)).InstancePerLifetimeScope();
-                builder.RegisterGeneric(typeof(RepositoryBase<,>)).As(typeof(IRepositoryBase<,>)).InstancePerLifetimeScope();
-                #endregion Repository
-
-                #region Service
-
-                var assemblyServices = Assembly.Load("Admin.Core.Service");
-                builder.RegisterAssemblyTypes(assemblyServices)
-                .AsImplementedInterfaces()
-                .InstancePerLifetimeScope()
-                .PropertiesAutowired()// 属性注入
-                .InterceptedBy(interceptorServiceTypes.ToArray())
-                .EnableInterfaceInterceptors();
-
-                #endregion Service
+                // 服务注入
+                builder.RegisterModule(new ServiceModule(_appConfig));
             }
             catch (Exception ex)
             {

+ 1 - 0
Admin.Tools/Captcha/SlideJigsawCaptcha.cs

@@ -63,6 +63,7 @@ namespace Admin.Tools.Captcha
         /// <returns></returns>
         private Bitmap CutByTemplate(Bitmap baseImage, Bitmap templateImage, int x, int y)
         {
+            //生成透明背景图
             Bitmap newImage = new Bitmap(templateImage.Width, baseImage.Height);
             for (int i = 0, newImageWidth = templateImage.Width; i < newImageWidth; i++)
             {