.NET 6 实现滑动验证码(四)、扩展类

打印 上一主题 下一主题

主题 892|帖子 892|积分 2676

为了能够通过配置文件(appsettings.json)或通过代码进行背景图片与模板进行配置、可自定义资源类型、自定义验证规则,本节创建一些扩展类,用来实现这些功能。
上一节内容:NET 6 实现滑动验证码(三)、接口

扩展类都放在了Extensions文件夹下

目录

CaptchaBuilderExtensions.cs

CaptchaBuilderExtensions.cs实现了自定义提供验证码背景图片资源或模板资源、自定义实现资源类型、替换默认验证规则、禁用默认凹槽模板
  1. using SlideCaptcha;
  2. using SlideCaptcha.Interface;
  3. using SlideCaptcha.Resources.Provider;
  4. using System.Linq;
  5. namespace Microsoft.Extensions.DependencyInjection
  6. {
  7.     public static class CaptchaBuilderExtensions
  8.     {
  9.         /// <summary>
  10.         /// 自定义提供验证码背景图片资源或模板资源
  11.         /// </summary>
  12.         /// <typeparam name="TProvider">自定义实现</typeparam>
  13.         /// <param name="builder"></param>
  14.         /// <returns></returns>
  15.         public static CaptchaBuilder AddResourceProvider<TProvider>(this CaptchaBuilder builder) where TProvider : class, IResourceProvider
  16.         {
  17.             builder.Services.AddSingleton<IResourceProvider, TProvider>();
  18.             return builder;
  19.         }
  20.         /// <summary>
  21.         /// 自定义实现资源类型
  22.         /// </summary>
  23.         /// <typeparam name="THandler">自定义实现</typeparam>
  24.         /// <param name="builder"></param>
  25.         /// <returns></returns>
  26.         public static CaptchaBuilder AddResourceHandler<THandler>(this CaptchaBuilder builder) where THandler : class, IResourceHandler
  27.         {
  28.             builder.Services.AddSingleton<IResourceHandler, THandler>();
  29.             return builder;
  30.         }
  31.         /// <summary>
  32.         /// 替换默认的验证规则
  33.         /// </summary>
  34.         /// <typeparam name="TValidator">自定义验证规则</typeparam>
  35.         /// <param name="builder"></param>
  36.         /// <returns></returns>
  37.         public static CaptchaBuilder ReplaceValidator<TValidator>(this CaptchaBuilder builder) where TValidator : class, IValidator
  38.         {
  39.             builder.Services.Replace<IValidator, TValidator>();
  40.             return builder;
  41.         }
  42.         /// <summary>
  43.         /// 禁用默认凹槽模板
  44.         /// </summary>
  45.         /// <param name="builder"></param>
  46.         /// <returns></returns>
  47.         public static CaptchaBuilder DisableDefaultTemplates(this CaptchaBuilder builder)
  48.         {
  49.             var serviceDescriptor = builder.Services.FirstOrDefault(e => e.ImplementationType == typeof(EmbeddedResourceProvider));
  50.             if (serviceDescriptor != null)
  51.             {
  52.                 builder.Services.Remove(serviceDescriptor);
  53.             }
  54.             return builder;
  55.         }
  56.     }
  57. }
复制代码
CaptchaServiceCollectionExtensions.cs

CaptchaServiceCollectionExtensions.cs为自动注入必要的接口
  1. using Microsoft.Extensions.Configuration;
  2. using SlideCaptcha;
  3. using SlideCaptcha.Constant;
  4. using SlideCaptcha.Generator;
  5. using SlideCaptcha.Interface;
  6. using SlideCaptcha.Resources;
  7. using SlideCaptcha.Resources.Handler;
  8. using SlideCaptcha.Resources.Provider;
  9. using SlideCaptcha.Storage;
  10. using SlideCaptcha.Validator;
  11. using System;
  12. namespace Microsoft.Extensions.DependencyInjection
  13. {
  14.     public static class CaptchaServiceCollectionExtensions
  15.     {
  16.         /// <summary>
  17.         /// 依赖注入必要的接口。
  18.         /// </summary>
  19.         /// <param name="services"></param>
  20.         /// <param name="configuration"></param>
  21.         /// <param name="optionsAction"></param>
  22.         /// <returns></returns>
  23.         public static CaptchaBuilder AddSlideCaptcha(this IServiceCollection services, IConfiguration configuration, Action<CaptchaOptions> optionsAction = default)
  24.         {
  25.             services.Configure<CaptchaOptions>(configuration?.GetSection("SlideCaptcha"));
  26.             //对所需验证的参数进行检查,如果参数不合法就抛一个异常出来
  27.             if (optionsAction != null) services.PostConfigure(optionsAction);
  28.             var builder = new CaptchaBuilder(services);
  29.             services.AddSingleton<IResourceProvider, OptionsResourceProvider>();
  30.             services.AddSingleton<IResourceProvider, EmbeddedResourceProvider>();
  31.             services.AddSingleton<IResourceHandlerManager, CachedResourceHandlerManager>();
  32.             services.AddSingleton<IResourceManager, DefaultResourceManager>();
  33.             services.AddSingleton<ISliderCaptchaImageGenerator, SliderCaptchaImageGenerator>();
  34.             services.AddSingleton<IResourceHandler, FileResourceHandler>();
  35.             services.AddSingleton<IResourceHandler, EmbeddedResourceHandler>();
  36.             services.AddScoped<ICaptcha, ImageCaptcha>();
  37.             services.AddScoped<IStorage, DefaultStorage>();
  38.             services.AddScoped<IValidator, SimpleValidator>();
  39.             return builder;
  40.         }
  41.     }
  42. }
复制代码
ServiceCollectionExtensions.cs

ServiceCollectionExtensions.cs用于实现IServiceCollection的Replace方法
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Microsoft.Extensions.DependencyInjection
  5. {
  6.     public static class ServiceCollectionExtensions
  7.     {
  8.         public static IServiceCollection Replace<TService, TImplementation>(this IServiceCollection services)
  9.                where TImplementation : TService
  10.         {
  11.             return services.Replace<TService>(typeof(TImplementation));
  12.         }
  13.         public static IServiceCollection Replace<TService>(this IServiceCollection services, Type implementationType)
  14.         {
  15.             return services.Replace(typeof(TService), implementationType);
  16.         }
  17.         public static IServiceCollection Replace(this IServiceCollection services, Type serviceType, Type implementationType)
  18.         {
  19.             if (services == null)
  20.             {
  21.                 throw new ArgumentNullException(nameof(services));
  22.             }
  23.             if (serviceType == null)
  24.             {
  25.                 throw new ArgumentNullException(nameof(serviceType));
  26.             }
  27.             if (implementationType == null)
  28.             {
  29.                 throw new ArgumentNullException(nameof(implementationType));
  30.             }
  31.             if (!services.TryGetDescriptors(serviceType, out var descriptors))
  32.             {
  33.                 throw new ArgumentException($"No services found for {serviceType.FullName}.", nameof(serviceType));
  34.             }
  35.             foreach (var descriptor in descriptors)
  36.             {
  37.                 var index = services.IndexOf(descriptor);
  38.                 services.Insert(index, descriptor.WithImplementationType(implementationType));
  39.                 services.Remove(descriptor);
  40.             }
  41.             return services;
  42.         }
  43.         private static bool TryGetDescriptors(this IServiceCollection services, Type serviceType, out ICollection<ServiceDescriptor> descriptors)
  44.         {
  45.             return (descriptors = services.Where(service => service.ServiceType == serviceType).ToArray()).Any();
  46.         }
  47.         private static ServiceDescriptor WithImplementationType(this ServiceDescriptor descriptor, Type implementationType)
  48.         {
  49.             return new ServiceDescriptor(descriptor.ServiceType, implementationType, descriptor.Lifetime);
  50.         }
  51.     }
  52. }
复制代码
SlideCaptchaException.cs

SlideCaptchaException.cs 实现自定义异常信息。
  1. using System;
  2. namespace SlideCaptcha.Exceptions
  3. {
  4.     public class SlideCaptchaException : Exception
  5.     {
  6.         public SlideCaptchaException() : base()
  7.         {
  8.         }
  9.         public SlideCaptchaException(string message) : base(message)
  10.         {
  11.         }
  12.         public SlideCaptchaException(string message, Exception innerException) : base(message, innerException)
  13.         {
  14.         }
  15.     }
  16. }
复制代码
下载方式:
扫描公众号二维码,或搜索公众号fenxiang3389关注我,回复captcha下载,压缩包包含了验证码类库、服务端API、HTML+JQuery完整代码、vue3组件代码及演示代码!
欢迎大家关注我的微信公众号,一起进步,一起成长
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表