DDD 聚合根之间的一对多关系

问题描述 投票:0回答:1

我正在尝试为我的应用程序后端建模一个域。在我的域中,我有厨师聚合根,每个厨师都有一个种族。如果我们认为在存在层中种族和厨师具有一对多的关系(一个种族可以分配给多个厨师)。 我想要厨师什么时候创建。管理员将从可用种族列表中选择种族。如果我创建种族实体类型并获取种族列表,这违反了不得在根之外访问聚合的任何子级的原则。

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操作。

domain-driven-design aggregateroot
1个回答
0
投票

管理员将从可用种族列表中选择种族。如果我创建种族实体类型并获取种族列表,这违反了不得在根之外访问聚合的任何子级的原则。

直接从存储库访问种族是可以的,因为它处于不同的上下文中。聚合类型代表上下文。

如果您要创建一名新厨师,您还应该传递种族和姓名等。除非域允许厨师具有“未知”种族(在系统中表示为

null

© www.soinside.com 2019 - 2024. All rights reserved.