在领域驱动设计中,我们介绍了价值对象(ValueObject)的概念,其中对象不带有身份标识。
Microsoft在其微服务系列中提供了他们的ValueObject实现,他们重写Equals()方法,以便将具有相同值的两个ValueObject视为相同。
我包含了他们的实现代码,但我的问题与EqualOperator()和NotEqualOperator()方法有关 - 它们是如何工作的?何时调用它们?
我熟悉运算符重载,但这似乎是一种我从未见过的实现方式,我找不到任何相关文档。
以下是实现代码:
Microsoft在其微服务系列中提供了他们的ValueObject实现,他们重写Equals()方法,以便将具有相同值的两个ValueObject视为相同。
我包含了他们的实现代码,但我的问题与EqualOperator()和NotEqualOperator()方法有关 - 它们是如何工作的?何时调用它们?
我熟悉运算符重载,但这似乎是一种我从未见过的实现方式,我找不到任何相关文档。
以下是实现代码:
public abstract class ValueObject
{
protected static bool EqualOperator(ValueObject left, ValueObject right)
{
if (ReferenceEquals(left, null) ^ ReferenceEquals(right, null))
{
return false;
}
return ReferenceEquals(left, null) || left.Equals(right);
}
protected static bool NotEqualOperator(ValueObject left,
ValueObject right)
{
return !(EqualOperator(left, right));
}
protected abstract IEnumerable<object> GetAtomicValues();
public override bool Equals(object obj)
{
if (obj == null || obj.GetType() != GetType())
{
return false;
}
ValueObject other = (ValueObject)obj;
IEnumerator<object> thisValues = GetAtomicValues().GetEnumerator();
IEnumerator<object> otherValues =
other.GetAtomicValues().GetEnumerator();
while (thisValues.MoveNext() && otherValues.MoveNext())
{
if (ReferenceEquals(thisValues.Current, null) ^
ReferenceEquals(otherValues.Current, null))
{
return false;
}
if (thisValues.Current != null &&
!thisValues.Current.Equals(otherValues.Current))
{
return false;
}
}
return !thisValues.MoveNext() && !otherValues.MoveNext();
}
// Other utilility methods
}
这是他们的对象使用的示例:
public class Address : ValueObject
{
public String Street { get; private set; }
public String City { get; private set; }
public String State { get; private set; }
public String Country { get; private set; }
public String ZipCode { get; private set; }
private Address() { }
public Address(string street, string city, string state, string country,
string zipcode)
{
Street = street;
City = city;
State = state;
Country = country;
ZipCode = zipcode;
}
protected override IEnumerable<object> GetAtomicValues()
{
// Using a yield return statement to return
// each element one at a time
yield return Street;
yield return City;
yield return State;
yield return Country;
yield return ZipCode;
}
}
Equals
而不是EqualOperator
方法。 - jasdefer