记录自己使用.net6

打印 上一主题 下一主题

主题 893|帖子 893|积分 2679

首先依赖注入 懒得下载autofac了 直接用程序集进行批量注入
  1. private static WebApplicationBuilder builder;
  2.         internal static void Load(WebApplicationBuilder web)
  3.         {
  4.             builder = web;
  5.             builder.Services.Configure<ApiBehaviorOptions>(options => options.SuppressModelStateInvalidFilter = true);
  6.              Assembly.Load("TestApplication").ExportedTypes.LoadImp();
  7.             builder.Services.AddSingleton(typeof(ITestGren<>), typeof(TestGren<>));
  8.         }
  9.         private static void LoadImp(this IEnumerable<Type> type)
  10.         {
  11.            type= type.Where(d => d.IsClass&&!d.IsAbstract);
  12.             foreach (var item in type)
  13.             {   ///检查是不是泛型类
  14.                 if (item.GetGenericArguments().Length is 0) item.GetInterfaces().LoadInter(item);
  15.             }
  16.         }
  17.         private static void LoadInter(this Type[] type,Type ImpType)
  18.         {
  19.             foreach (var item in type)
  20.             {
  21.                if (item.GetGenericArguments().Length is 0) builder.Services.AddSingleton(item,ImpType);
  22.             }
  23.         }
复制代码
可惜泛型类不能直接注入 需要自己写,反正自己也不怎么写泛型类
然后我们的接口要验签就创建一个类来继承ValidationAttribute特性
  1. [CheckSgValidation(ErrorMessage ="签名错误")]
  2.     public class TestModel
  3.     {
  4.         public string Sg { get; set; }
  5.     }
  6.     public class CsModel:TestModel
  7.     {
  8.         public int MyProperty { get; set; }
  9.     }
  10.     [AttributeUsage(AttributeTargets.Class )]
  11.     public class CheckSgValidation: ValidationAttribute
  12.     {
  13.         private string SgName = "Sg";
  14.         public CheckSgValidation(string sgName)
  15.         {
  16.             this.SgName = sgName;
  17.         }
  18.         public CheckSgValidation() { }
  19.         public override bool IsValid(object? value)
  20.         {
  21.             StringBuilder sb = new StringBuilder();
  22.             foreach (var item in value.GetType().GetProperties())
  23.             {
  24.                 if (item.Name == SgName) continue;
  25.                 sb.Append(item.GetValue(value));
  26.             }
  27.             return sb.ToString() == value.GetType().GetProperty(SgName).GetValue(value).ToString();
  28.         }
  29.     }
复制代码
我是用单独一个类来写上我们自定义的特性, 尝试过用表达式树进行验证的 可惜参数为object就不行 不知道怎么处理这个问题
这样用反射确实可以用

 验证redis登录验证码或其他传入key,value的特性
  1.     internal interface IRedis
  2.     {
  3.         bool Get(string key);
  4.         bool GetDelete(string key);
  5.     }
  6.     internal class Redis : IRedis
  7.     {
  8.         internal Redis(string conn) { }
  9.         public bool Get(string key){ return true; }
  10.         public bool GetDelete(string key){ return false; }
  11.     }
  12.     internal static class StaticSingle
  13.     {
  14.         public static readonly IRedis _redis;
  15.         static StaticSingle()
  16.         {
  17.             ///本质上单列式一种多态  我们这个静态构造函数式启动时只运行一次 可以这样实现单例
  18.             _redis = new Redis("127");
  19.         }
  20.     }
  21.     [AttributeUsage(AttributeTargets.Class|AttributeTargets.Property)]
  22.     public class CheckRedisValidation : ValidationAttribute
  23.     {
  24.         public string key = string.Empty;
  25.         public string value = string.Empty;
  26.         public bool IsDel=true;
  27.         public sealed override bool IsValid(object? value)
  28.         {
  29.             ///为空说明是放入在属性上
  30.            if(this.key is null)
  31.             {
  32.                 var array= value.ToString().Split(',');
  33.                 if (array.Length is 1) return false;
  34.                 ///value: "key,value"
  35.                 ///这里自己就不写读取比较了
  36.                 return IsDel ? StaticSingle._redis.GetDelete(array[0]) : StaticSingle._redis.Get(key);
  37.             }
  38.             else
  39.             {
  40.                 key = value.GetType().GetProperty(key).GetValue(value).ToString();
  41.                 this.value = value.GetType().GetProperty(this.value).GetValue(value).ToString().ToLower();
  42.                 return IsDel ? StaticSingle._redis.GetDelete(key) : StaticSingle._redis.Get(key);
  43.             }
  44.         }
  45.     }
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

干翻全岛蛙蛙

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