聚合、实体和值对象
在我看来,一个实体是一个 child,其名称 (Id) 是一个 Aggregate,而后者又是 Father带有名称 (Id)。
聚合不能有实体。
你可以认为是一个实体,不:一个实体只存在于一个聚合中。
实体(子)是一个小聚合(父),没有其他实体(子)。
父亲和孩子可以使用透明框(我没有更好的办法来翻译ValueObject的概念,抱歉):当您创建一个透明框时,您无法更改任何内容,但您可以阅读内容,如果您想更新该框,您必须创建一个新框。
聚合负责管理实体,这意味着:添加、更新、删除和查询。
如果您想与一个或多个实体交谈(查询),您必须询问聚合,因此,当您加载聚合时,您必须加载所有实体。
一个聚合可以有多种类型的实体,有多少?嗯,这取决于您、设计和系统。
显然,包含许多实体且每个实体很多行的许多字段的大聚合可能效率不高,在这种情况下,也许您可以选择最大的实体并上交具有或不具有子级的聚合。
实例
我在 csharp 上写了示例,但与 Java 没有太大区别。
class Invoice : ValueObject
{
public string Number { get; private set; }
public DateTime Date { get; private set; }
public decimal TaxableAmount { get; private set; }
public decimal VatAmount { get; private set; }
public decimal TotalAmount => TaxableAmount + VatAmount;
public Invoice(string number, DateTime date, decimal taxableAmount, decimal
vatAmount)
{
// validation
Number = number;
[..]
}
}
class Taxonomy : Entity
{
public int Id {get; private set;}
public decimal Amount {get; private set;}
public string Classfication {get; private set;}
public Taxonomy(int id, decimal amount, string classification)
{
// validation
Id = id;
[..]
}
}
class SaleAggregate : AggregateRoot
{
private List<Taxonomy> _taxonomies;
public int Id {get; private set;}
public Invoice Invoice {get; private set;}
public IReadOnlyCollection<Taxonomy> Taxonomies => _taxonomies.AsReadOnly();
public SaleAggregate(int id, string number, DateTime date, decimal
taxableAmount, decimal vatAmount)
{
_taxonomies = new List<Taxonomy>();
// I prefer to pass ALWAYS primitive types to not rely on valueObject
// validation
Id = id;
Invoice = new Invoice(number, date, taxableAmount, vatAmount)
[..]
}
public void AddTaxonomy(int id, decimal amount, string classification)
{
// validation
_taxonomies.Add(new Taxonomy(id, amount, classification);
}
public void UpdateTaxonomy(int id, decimal amount, string classification)
{
// validation
var entity = _taxonomies.FirstOrDefault(p=> p.Id == id);
entity.Amount = amount;
entity.Classification = classification;
}
public void RemoveTaxonomy(int id)
{
// validation
var entity = _taxonomies.FirstOrDefault(p=> p.Id == id);
_taxonomy.Remove(entity);
}
public void UpdateVatAmount(decimal vatAmount)
{
// validation
Invoice = new Invoice(Invoice.Number, Invoice.Date,
Invoice.TaxableAmount, vatAmount);
}
}
再次重申:这是我对 Aggregate、Entities 和 ValueObject 的看法,阅读本文的其他开发人员可以随时纠正我。