首页 > 解决方案 > 如何在 abp.io 中初始化子集合以及聚合根

问题描述

我想要实现的是找出在哪里使用聚合根本身初始化我的子集合,并以最佳实践方式验证业务规则。

这是我的应用服务:

public async Task<ReservationDto> CreateReservationAsync(CreateReservationInputDto input)
    {
        var reservation = await _reservationSystemManager.CreateAsync(
            input.ReserverNotes
        );

        //should i send them directly to manager's createasync method but RequestedItems  are dto objects.  
        //should i iterate through RequestedItems here and send them to manager one by one.
        // where to throw business exception if RequestedItems count is 0.
    }  

这是我的输入:

public class CreateReservationInputDto
{
    public string ReserverNotes { get; set; }

    public Enum.Status Status { get; set; }

    public List<CreateReservationItemInputDto> RequestedItems { get; set; }
}

这是我的聚合根:

public class Reservation : FullAuditedAggregateRoot<Guid>
{
    public Enum.Status Status { get; private set; }

    public string ReserverNote { get; private set; }

    public ICollection<ReservationItem> ReservationItems { get; set; }

    public ICollection<OverduePayment> OverduePayments { get; set; }

    private Reservation() { }

    internal Reservation(
        Guid id,
        Enum.Status status,
        [NotNull] string reserverNote,
        ) : base(id)
    {
        ReserverNote = reserverNote;
        Status = status;

        ReservationItems = new Collection<ReservationItem>();
        OverduePayments = new Collection<OverduePayment>();
    }

    //I could not decide where and how to call this function from Domain Service.  
    internal void AddReservationItem(ReservationItem reservationItem)
    {
        if (ReservationItems.Any(r => r.Id == reservationItem.Id))
        {
            return;
        }

        ReservationItems.Add(reservationItem);
    }
}

标签: domain-driven-designabp

解决方案


好吧,取决于您的业务规则和用例。例如,如果预订必须有一些预订项目,那么我将在预订构造函数中创建它。否则,如果在创建预订后我可以添加新的预订项目,那么我将成为另一个用例,然后 AddReservationItem 对我有意义。


推荐阅读