Установка идентичности доменного объекта
Все сущности в домене должны иметь идентичность. Наследуя отDomainEntity
Я могу предоставить личность для классов.
Городской домен (для облегчения чтения):
public class City : DomainEntity, IAggregateRoot
{
public string Name { get; private set; }
public Coordinate Coordinate { get; private set; }
public City(string name, decimal latitude, decimal longitude)
{
Name = name;
SetLocation(latitude, longitude);
}
public City(string name, decimal latitude, decimal longitude, int id)
: base(id)
{
Name = name;
Coordinate = coordinate;
SetLocation(latitude, longitude);
}
public void SetLocation(decimal latitude, decimal longitude)
{
Coordinate = new Coordinate(latitude, longitude);
}
}
Абстрактный класс DomainEntity:
public abstract class DomainEntity
{
private int? uniqueId;
public int Id
{
get
{
return uniqueId.Value;
}
}
public DomainEntity()
{ }
public DomainEntity(int id)
{
uniqueId = id;
}
}
Когда новый объект создается впервые, идентификатор не существует. Идентичность будет существовать только после сохранения сущности. Из-за этого при создании нового экземпляра объекта,Id
не нужно поставлять:
var city = new City("Cape Town", 18.42, -33.92);
Когда города читаются из постоянства, используяCityRepository
, тогда второй конструктор будет также использоваться для заполнения свойства identity:
public class CityRepository : ICityRepository
{
public City Find(int id)
{
var cityTblEntity = context.Set().Find(id);
return new City(cityTblEntity.Name, cityTblEntity.Lat, cityTblEntity.Long, cityTblEntity.Id);
}
}
Проблема, с которой я столкнулся здесь, заключается в том, что я предоставляю конструктор, который может принимать идентичность. Это открывает дыру. Я только хочу, чтобы идентичность была установлена на уровне хранилища, но клиентский код теперь может также начать настройкуId
ценности. Какие's мешает кому-то сделать это:
var city = new City("Cape Town", 18.42, -33.92, 99999); // What is 99999? It could even be an existing entity!
Как я могу предоставить способы установить идентичность объекта в моем хранилище, но скрыть это от клиентского кода? Возможно, мой дизайн имеет недостатки. Могу ли я использовать фабрики, чтобы решить эту проблему?
Замечания: Я понимаю, что это не идеальная реализация DDD, поскольку сущности должны иметь идентичность с самого начала.Guid
Тип поможет мне решить эту проблему, но я нек сожалению, такой роскоши.