При дизайна, управляван от домейн, една от определящите характеристики на обекта е, че той има идентичност.
Проблем:
Не мога да предоставя уникална самоличност на обекти при създаване на екземпляр. Тази самоличност се предоставя от хранилището само след като обектът се запази (тази стойност се предоставя от основната база данни).
Не мога да започна да използвам Guid
стойности на този етап. Съществуващите данни се съхраняват с int
стойности на първичен ключ и не мога да генерирам уникален int при инстанциране.
Моето решение:
- Всяка единица има стойност на идентичност
- Идентичността се настройва на истинска самоличност само след като се запази (осигурена от базата данни)
- Самоличността е зададена по подразбиране, когато се инстанцира преди постоянството
- Ако самоличността е по подразбиране, обектите са сравними чрез препратка
- Ако самоличността не е по подразбиране, обектите са сравними чрез стойности на идентичност
Код (абстрактният базов клас за всички обекти):
public abstract class Entity<IdType>
{
private readonly IdType uniqueId;
public IdType Id
{
get
{
return uniqueId;
}
}
public Entity()
{
uniqueId = default(IdType);
}
public Entity(IdType id)
{
if (object.Equals(id, default(IdType)))
{
throw new ArgumentException("The Id of a Domain Model cannot be the default value");
}
uniqueId = id;
}
public override bool Equals(object obj)
{
if (uniqueId.Equals(default(IdType)))
{
var entity = obj as Entity<IdType>;
if (entity != null)
{
return uniqueId.Equals(entity.Id);
}
}
return base.Equals(obj);
}
public override int GetHashCode()
{
return uniqueId.GetHashCode();
}
}
Въпрос:
- Смятате ли, че това е добра алтернатива на генерирането на Guid стойности при създаване на екземпляр?
- Има ли по-добри решения за този проблем?
uniqueId
след вмъкване? И как вашето репо има достъп до това поле при актуализиране, за да знае кой ред да актуализира? - person Timo   schedule 28.06.2018