我想封装聚合的内部,但按照目前的方式,我可以直接调用Person.Address.Update()
并修改该实体。
我想让Person.Address
成为一个私有字段,并且不能从聚合根类外部访问。有人能解释一下如何为实体框架核心进行流畅的API映射吗。地址在自己的表中(与Person的一对一关系(。我无法让它发挥作用,也不想被当前的设计所束缚。
public class Person : Entity, IAggregateRoot
{
public string FirstName { get; private set; }
public string LastName { get; private set; }
public Address Address { get; private set; }
private Person() { }
public Person(string firstName, string lastName, Address address)
{
FirstName = firstName;
LastName = lastName;
Address = address;
}
public void UpdateAddress(string streetName)
{
Address.Update(streetName);
}
}
public class Address : Entity
{
public string StreetName { get; private set; }
private Address() { }
public Address(string streetName)
{
StreetName = streetName;
}
public void Update(string streetName)
{
StreetName = streetName;
}
}
在我看来,您通过UpdateAddress实现地址修改的方式是正确的。您有一个聚合,它有大量公开的业务方法,通过这些方法可以修改聚合和被包围实体的整个状态。也许你可以找到一个比UpdateAddress更好的方法名称,因为"更新"似乎是技术细节,可能是:AssignAddres、LocateAtAddress、AttachAddress。此外,在UpdateAddress方法中,当聚合(+内部实体(的状态发生变化时,应该有广播的业务事件,例如:PersonaLocatedAtAddressEvent。