我正在尝试为我的应用程序后端建模一个域。在我的域中,我有厨师聚合根,每个厨师都有一个种族。如果我们认为在存在层中种族和厨师具有一对多的关系(一个种族可以分配给多个厨师)。 我想要厨师什么时候创建。管理员将从可用种族列表中选择种族。如果我创建种族实体类型并获取种族列表,这违反了不得在根之外访问聚合的任何子级的原则。
public class Cook : AggregateRoot<CookId>
{
private Cook() : base(null)
{
}
public Cook(CookId id, string name, string intro, Address address, string email) : base(id)
{
Name = name;
Intro = intro;
Address = address;
Email = email;
CreatedAt = DateTimeOffset.Now;
ModifiedAt = DateTimeOffset.Now;
}
public readonly List<MealId> mealIds = new();
public string Name { get; private set; }
public string Intro { get; private set; }
public Address Address { get; private set; }
public int Phone { get; private set; }
public string Email { get; private set; }
public EthnicityId EthnicityId { get; private set; }
public DateTimeOffset CreatedAt { get; private set; }
public DateTimeOffset ModifiedAt { get; private set; }
internal List<Review> _reviews = new();
internal List<Meal> _meals = new();
public IReadOnlyCollection<Review> Reviews => _reviews.AsReadOnly();
public IReadOnlyCollection<Meal> Meals => _meals.AsReadOnly();
public void AddReview(int rating, string comment)
{
_reviews.Add(Review.Create(rating, comment));
}
public void AddMeal(Meal meal)
{
_meals.Add(Meal);
}
}
所以,我的问题是种族是否应该是聚合根本身,以便可以通过厨师聚合中的 ID 进行引用。这样就可以对种族存储库进行CRUD操作。
管理员将从可用种族列表中选择种族。如果我创建种族实体类型并获取种族列表,这违反了不得在根之外访问聚合的任何子级的原则。
直接从存储库访问种族是可以的,因为它处于不同的上下文中。聚合类型代表上下文。
如果您要创建一名新厨师,您还应该传递种族和姓名等。除非域允许厨师具有“未知”种族(在系统中表示为
null
)