JsonAuditLogContractResolver.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Serialization;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using VCommon.VApplication.Auditing.DataAnnotations;
  7. namespace VCommon.VApplication.Auditing.Json
  8. {
  9. internal class JsonAuditLogContractResolver : DefaultContractResolver
  10. {
  11. protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
  12. {
  13. var properties = base.CreateProperties(type, memberSerialization);
  14. foreach (var prop in properties)
  15. {
  16. var attrs = prop.AttributeProvider.GetAttributes(true);
  17. //检测并禁止JsonIgnore, 提示使用DisableAuditingAttribute
  18. if (attrs.Any(p => p is JsonIgnoreAttribute)) throw new VAuditModelException($"检测到{nameof(JsonIgnoreAttribute)}特性,要禁用审计日志请使用{nameof(DisableAuditingLogAttribute)}代替. 类:{type.FullName},成员:{prop.UnderlyingName}");
  19. //用DisableAuditing代替JsonIgnore
  20. if (attrs.Any(p => p is DisableAuditingLogAttribute)) prop.Ignored = true;
  21. //实现SimplifyAuditing
  22. var sim = attrs.OfType<SimplifyAuditingLogAttribute>().SingleOrDefault();
  23. if (null != sim) prop.Converter = new JsonSimplifyAuditingConverter(sim.MaxLengthAllowed);
  24. }
  25. return properties;
  26. }
  27. }
  28. }