ValueObject.cs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // Learn more: https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/implement-value-objects
  2. namespace AipGateway.API.Domain.Common.Extensions
  3. {
  4. public abstract class ValueObject
  5. {
  6. protected static bool EqualOperator(ValueObject left, ValueObject right)
  7. {
  8. if (left is null ^ right is null)
  9. {
  10. return false;
  11. }
  12. return left?.Equals(right!) != false;
  13. }
  14. protected static bool NotEqualOperator(ValueObject left, ValueObject right)
  15. {
  16. return !EqualOperator(left, right);
  17. }
  18. protected abstract IEnumerable<object> GetEqualityComponents();
  19. public override bool Equals(object? obj)
  20. {
  21. if (obj == null || obj.GetType() != GetType())
  22. {
  23. return false;
  24. }
  25. var other = (ValueObject)obj;
  26. return GetEqualityComponents().SequenceEqual(other.GetEqualityComponents());
  27. }
  28. public override int GetHashCode()
  29. {
  30. return GetEqualityComponents()
  31. .Select(x => x != null ? x.GetHashCode() : 0)
  32. .Aggregate((x, y) => x ^ y);
  33. }
  34. }
  35. }