Установка идентичности доменного объекта

Все сущности в домене должны иметь идентичность. Наследуя от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 Тип поможет мне решить эту проблему, но я нек сожалению, такой роскоши.

Ответы на вопрос(4)

Ваш ответ на вопрос