Ich versuche zu verstehen, wie und wo Domänenmodellfabriken implementiert werden sollen. Ich habe mein CompanyAggregat als Demo aufgenommen, wie ich es gemacht habe.
Ich habe meine Entwurfsentscheidungen am Ende aufgenommen - ich würde mich über Kommentare, Vorschläge und Kritik zu diesen Punkten freuen.
Das CompanyDomain-Modell:
public class Company : DomainEntity, IAggregateRoot
{
private string name;
public string Name
{
get
{
return name;
}
private set
{
if (String.IsNullOrWhiteSpace(value))
{
throw new ArgumentOutOfRangeException("Company name cannot be an empty value");
}
name = value;
}
}
internal Company(int id, string name)
{
Name = name;
}
}
Die CompanyFactoryDomain Factory:
Diese Klasse wird verwendet, um sicherzustellen, dass Geschäftsregeln und Invarianten beim Erstellen neuer Instanzen von Domänenmodellen nicht verletzt werden. Es würde sich in der Domänenschicht befinden.
public class CompanyFactory
{
protected IIdentityFactory<int> IdentityFactory { get; set; }
public CompanyFactory(IIdentityFactory<int> identityFactory)
{
IdentityFactory = identityFactory;
}
public Company CreateNew(string name)
{
var id = IdentityFactory.GenerateIdentity();
return new Company(id, name);
}
public Company CreateExisting(int id, string name)
{
return new Company(id, name);
}
}
Der CompanyMapperEntity Mapper:
Diese Klasse wird verwendet, um Rich-Domain-Modelle und Entity Framework-Datenentitäten zuzuordnen. Es würde sich in Infrastrukturschichten befinden.
public class CompanyMapper : IEntityMapper<Company, CompanyTable>
{
private CompanyFactory factory;
public CompanyMapper(CompanyFactory companyFactory)
{
factory = companyFactory;
}
public Company MapFrom(CompanyTable dataEntity)
{
return DomainEntityFactory.CreateExisting(dataEntity.Id, dataEntity.Name);
}
public CompanyTable MapFrom(Company domainEntity)
{
return new CompanyTable()
{
Id = domainEntity.Id,
Name = domainEntity.Name
};
}
}
Der
CompanyKonstruktor wird als deklariertinternal.
Grund: Nur die Factory sollte diesen Konstruktor aufrufen.internalstellt sicher, dass keine anderen Ebenen es instanziieren können (Ebenen werden durch VS-Projekte getrennt).Die
CompanyFactory.CreateNew(string name)Methode wird beim Erstellen einer neuen Firma im System verwendet.
Grund: Da es noch nicht beibehalten worden wäre, muss eine neue eindeutige Identität dafür generiert werden (unter Verwendung derIIdentityFactory).Die
CompanyFactory.CreateExisting(int id, string name)Methode wirdCompanyRepositorybeim Abrufen von Elementen aus der Datenbank verwendet.
Grund: Das Modell hätte bereits eine Identität, daher müsste diese an das Werk geliefert werden.Das
CompanyMapper.MapFrom(CompanyTable dataEntity)wird von verwendet,CompanyRepositorywenn Daten aus der Persistenz abgerufen werden.
Grund: Hier müssen Entity Framework-Datenentitäten Domänenmodellen zugeordnet werden. DasCompanyFactorywird verwendet, um das Domänenmodell zu erstellen, um sicherzustellen, dass die Geschäftsregeln erfüllt werden.Das
CompanyMapper.MapFrom(Company domainEntity)wird von verwendet,CompanyRepositorywenn Modelle zur Persistenz hinzugefügt oder aktualisiert werden.
Grund: Domänenmodelle müssen direkt auf Datenentitätseigenschaften abgebildet werden, damit Entity Framework erkennen kann, welche Änderungen in der Datenbank vorgenommen werden müssen.
Vielen Dank