В доменно-ориентированном дизайне одной из определяющих характеристик сущности является ее идентичность.
Проблема:
Я не могу предоставить сущностям уникальный идентификатор при создании экземпляра. Этот идентификатор предоставляется репозиторием только после того, как объект сохраняется (это значение предоставляется из базовой базы данных).
Я не могу начать использовать значения 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