DomainException.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Exam.Infrastructure.Extensions;
  2. using Exam.Infrastructure.Validation.Enums;
  3. using Exam.Infrastructure.Validation.Validation;
  4. using System.Linq.Expressions;
  5. namespace Exam.Infrastructure.Validation.Exceptions
  6. {
  7. /// <summary>
  8. /// 业务逻辑异常
  9. /// </summary>
  10. [Serializable]
  11. public class DomainException : Exception
  12. {
  13. /// <summary>
  14. /// 异常对应领域实体属性名称(可为null)
  15. /// </summary>
  16. protected string EffectPropertyName
  17. {
  18. get;
  19. set;
  20. }
  21. public IValidationErrors ValidationErrors { get; private set; }
  22. public DomainException()
  23. {
  24. ValidationErrors = new ValidationErrors();
  25. }
  26. protected DomainException(string message) : base(message)
  27. {
  28. ValidationErrors = new ValidationErrors();
  29. }
  30. public DomainException(IValidationErrors validationErrors, ValidationErrorType errorType = ValidationErrorType.Body)
  31. {
  32. ValidationErrors = validationErrors;
  33. foreach (var validationError in ValidationErrors.ErrorItems)
  34. {
  35. validationError.ErrorType = errorType.GetDescription();
  36. }
  37. }
  38. public void AddErrors(IValidationErrors validationErrors)
  39. {
  40. ValidationErrors.AddErrors(validationErrors.ErrorItems);
  41. }
  42. public IValidationErrors AddError<TObject, TProperty>(Expression<Func<TObject, TProperty>> expression, object attemptedValue, string errorMessage, bool customState = false)
  43. {
  44. var memberExpression = expression.Body as MemberExpression;
  45. if (memberExpression != null)
  46. return ValidationErrors.AddError(memberExpression.Member.Name, errorMessage, attemptedValue, customState);
  47. return new ValidationErrors();
  48. }
  49. public IValidationErrors AddError(string propertyName, string errorMessage, string errorCode, string errorDescription, object attemptedValue)
  50. {
  51. return ValidationErrors.AddDomainError(propertyName, errorMessage, errorCode, errorDescription, attemptedValue);
  52. }
  53. public static TException Create<TException>(IValidationErrors errors) where TException : DomainException, new()
  54. {
  55. var exception = new TException();
  56. if (errors != null)
  57. {
  58. exception.ValidationErrors = errors;
  59. }
  60. return exception;
  61. }
  62. }
  63. }