黄色电影一区二区,韩国少妇自慰A片免费看,精品人妻少妇一级毛片免费蜜桃AV按摩师 ,超碰 香蕉

.Net集成敏感詞組件的步驟

.net集成敏感詞組件的步驟

 

toolgood.words

首先我們要使用的開源組件是 toolgood.words

通過(guò)簡(jiǎn)單的了解,我們可以知道它可以針對(duì)敏感詞及其拼音、跳詞等變形進(jìn)行檢測(cè),在實(shí)際的應(yīng)用場(chǎng)景中能滿足大部分的需求。
具體的用法在這里不做過(guò)多的介紹,接下來(lái)我們需要做的事情是如何在現(xiàn)有代碼中快速且方便的情況下接入敏感詞組件。很顯然,如果我們按照組件寫的示例去操作,會(huì)發(fā)現(xiàn)需要在現(xiàn)有的代碼中進(jìn)行大量重構(gòu)的操作,這顯然會(huì)累垮 vs 。熟悉水弟的朋友首先就會(huì)想到使用 aop 的方式去優(yōu)化處理。

 

validationattribute

我們先定義兩個(gè)簡(jiǎn)單的模型來(lái)綁定輸入?yún)?shù),一個(gè)是只要輸入含有敏感詞就會(huì)報(bào)錯(cuò),一個(gè)是只要輸入含有敏感詞就會(huì)把相關(guān)的字符串替換為 * ,代碼如下:

  public class mingancheckinput
  {
      [mingancheck]
      public string text { get; set; }
  }
  
  public class minganreplaceinput
  {
      [minganreplace]
      public string text { get; set; }
  }

其中 [mingancheck] 和 [minganreplace] 是我們定義的特性標(biāo)記,將其繼承 validationattribute,就和我們常用的 [required] 一樣方便,哪里敏感點(diǎn)哪里。

/// <summary>
  /// 敏感詞檢查的特性,一匹配就拋異常
  /// </summary>
  [attributeusage(attributetargets.property)]
  public class mingancheck : validationattribute
  {
      protected override validationresult isvalid(object value, validationcontext validationcontext)
      {
          throw  new notimplementedexception();
      }
  }

  /// <summary>
  /// 敏感詞替換
  /// </summary>
  [attributeusage(attributetargets.property)]
  public class minganreplace : validationattribute
  {
      protected override validationresult isvalid(object value, validationcontext validationcontext)
      {
          return validationresult.success;
      }
  }

接下來(lái)就是實(shí)現(xiàn) validationattribute 的功能,如果看過(guò)水弟寫過(guò)的 aop 文章,這時(shí)候就不會(huì)直接在校驗(yàn)的方法中直接引入 toolgood.words ,這樣會(huì)帶來(lái)很大的耦合,也不便于我們替換為其他的敏感詞組件或服務(wù)。所以我們只要再多一層抽象就可以了。

     // 檢查
      protected override validationresult isvalid(object value, validationcontext validationcontext)
      {
          return validationcontext.getservice<imingancheckvalidator>().isvalid(value, validationcontext);
      }
      // 替換
      protected override validationresult isvalid(object value, validationcontext validationcontext)
      {
          validationcontext.getservice<iminganreplacevalidator>().isvalid(value, validationcontext);
          return validationresult.success;
      }

接著我們分別實(shí)現(xiàn) imingancheckvalidator 和 iminganreplacevalidator 的功能,也即檢查和替換功能。

// 檢查
 public class mingancheckvalidator : imingancheckvalidator
  {
      public validationresult isvalid(object value, validationcontext validationcontext)
      {
          if (value is string v)
          {
              if (!string.isnullorempty(v))
              {
                 // 文字檢查
                  if (minganprovider.instance.illegalwordssearch.containsany(v))
                  {
                      return new validationresult("存在敏感詞", new[] { validationcontext.membername });
                  }
                  // 檢查拼音
                  if (minganprovider.instance.illegalwordssearch.containsany(wordshelper.getpinyin(v)))
                  {
                      return new validationresult("存在敏感詞",new []{ validationcontext.membername });
                  }
                  // todo:其他變種
              }
          }
          return validationresult.success;
      }
  }

//替換
public class minganreplacevalidator : iminganreplacevalidator
  {
      public void replace(object value, validationcontext validationcontext)
      {
          if (value is string v)
          {
              if (!string.isnullorempty(v))
              {
                  v = minganprovider.instance.illegalwordssearch.replace(v);
                  setpropertybyname(validationcontext.objectinstance,validationcontext.membername, v);
              }
          }
      }
      
      static bool setpropertybyname(object obj, string name, object value)
      {
          var type = obj.gettype();
          var prop = type.getproperty(name, bindingflags.public | bindingflags.instance);
          if (null == prop || !prop.canwrite) return false;
          prop.setvalue(obj, value, null);
          return true;
      }
  }

其中 minganprovider.instance.illegalwordssearch 是 toolgood.words 中的檢測(cè)類單例,這里不詳細(xì)展開。這樣我們就有一個(gè)大概能用的敏感詞檢測(cè)組件了,然而在實(shí)際過(guò)程中,我們還需要對(duì)敏感詞進(jìn)行管理,特別是需要實(shí)時(shí)更新敏感詞。

 

敏感詞熱重載

以 json 配置文件存放敏感詞為例,只需要配置熱重載就行了。
首先是 program.cs 文件中讓 json 配置文件熱重載。

        public static ihostbuilder createhostbuilder(string[] args) =>
          host.createdefaultbuilder(args)
              .configureappconfiguration((buildercontext, config) =>
              {
                  config.addjsonfile("illegalkeywords.json", optional: false, reloadonchange: true);// 配置可熱重載
              })
              .configurewebhostdefaults(webbuilder => { webbuilder.usestartup<startup>(); });

最后是在 startup.cs 中文件處理重載事件。

         changetoken.onchange(() => configuration.getreloadtoken(), () =>
          {
              // 敏感詞重載
          var keys= configuration.getsection("illegalkeywords").get<list<string>>();
          if (keys!=null&&keys.any())
          {
              var allkeys = new list<string>();
              foreach (var k in keys)
              {
                  allkeys.add(k); // 增加詞匯
                  allkeys.add(wordshelper.totraditionalchinese(k)); // 增加繁體
                  allkeys.add(wordshelper.getpinyin(k)); // 增加拼音
              }
              illegalwordssearch.setkeywords(allkeys);
          }
          });

 

效果

 

結(jié)語(yǔ)

看到這里,可能有些人已經(jīng)罵罵咧咧退出網(wǎng)站,說(shuō)好的兩分鐘,光是看文章和都需要十幾分鐘。所以為了滿足伸手黨的需求,我寫了一個(gè)簡(jiǎn)單的示例,只要把對(duì)應(yīng)文件和代碼復(fù)制到代碼就可以使用了,真的不超過(guò)2分鐘就能實(shí)現(xiàn)敏感詞檢測(cè)。
項(xiàng)目地址:https://github.com/jonechenug/toolgood.words.sample

以上就是.net集成敏感詞組件的步驟的詳細(xì)內(nèi)容,更多關(guān)于.net集成敏感詞組件的資料請(qǐng)關(guān)注碩編程其它相關(guān)文章!

下一節(jié):.net 中worker service的使用入門

asp.net編程技術(shù)

相關(guān)文章