Festlegen der Identität einer Domänenentität

Alle Entitäten in der Domäne müssen über eine Identität verfügen. Durch das Erben vonDomainEntityIch bin in der Lage, Klassen Identität zu verleihen.

Stadtdomänenentität (zum leichteren Lesen abgespeckt):

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);
    }
}

Abstrakte DomainEntity-Klasse:

public abstract class DomainEntity
{
    private int? uniqueId;

    public int Id
    {
        get
        {
            return uniqueId.Value;
        }
    }

    public DomainEntity()
    { }

    public DomainEntity(int id)
    {
        uniqueId = id;
    }
}

Beim erstmaligen Erstellen einer neuen Entität ist keine Identität vorhanden. Die Identität wird erst bestehen, wenn die Entität bestehen bleibt. Aus diesem Grund wird beim Erstellen einer neuen Instanz der EntitätId muss nicht geliefert werden:

var city = new City("Cape Town", 18.42, -33.92);

Wenn Städte anhand von a aus der Persistenz gelesen werdenCityRepositoryDann wird der zweite Konstruktor verwendet, um auch die Identitätseigenschaft zu füllen:

public class CityRepository : ICityRepository
{
    public City Find(int id)
    {
        var cityTblEntity = context.Set<CityTbl>().Find(id);

        return new City(cityTblEntity.Name, cityTblEntity.Lat, cityTblEntity.Long, cityTblEntity.Id);
    }
}

Das Problem, das ich hier habe, ist, dass ich einen Konstruktor zur Verfügung stelle, der Identität aufnehmen kann. Dies öffnet ein Loch. Ich möchte nur, dass die Identität in der Repository-Ebene festgelegt wird, aber der Client-Code kann jetzt auch festgelegt werdenId Werte. Was hält jemanden davon ab:

var city = new City("Cape Town", 18.42, -33.92, 99999);  // What is 99999? It could even be an existing entity!

Wie kann ich Möglichkeiten bereitstellen, um die Entitätsidentität in meinem Repository festzulegen, aber dies vor dem Clientcode zu verbergen? Vielleicht ist mein Design fehlerhaft. Könnte ich Fabriken verwenden, um dies zu lösen?

Hinweis: Ich verstehe, dass dies keine perfekte Implementierung von DDD ist, da Entitäten von Anfang an eine Identität haben sollten. DasGuid Typ würde mir helfen, dieses Problem zu lösen, aber ich habe diesen Luxus leider nicht.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage