微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 abp.io 中初始化子集合和聚合根

如何解决如何在 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);
    }
}

解决方法

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

,

通常,如果您需要注入多个服务(例如 IUserRepository 和 IReservationItemsRepository)来验证您的集合或任何其他属性,您可以创建一个 domain service 并实现您的业务逻辑并根据您的需要验证您的集合.

如果您不需要注入任何服务来实现您的业务规则,您可以直接在您的应用程序服务方法中进行。在这种情况下,您可以使用数据注释来验证 DTO 类中的属性,如 here 中所述。

//我是否应该将它们直接发送到 manager 的 createasync 方法,但 RequestedItems 是 dto 对象。
//我应该在这里遍历RequestedItems并将它们一一发送给经理。 // 如果 RequestedItems 计数为 0,在哪里抛出业务异常。

在你问的这三个问题中,应该分开回答。

  • 例如,如果您创建一个 domain service 类,并且该类方法中的 RequestedItems 计数为 0,则最好抛出异常。 (在这种情况下,您可以从域服务的方法中调用您的 AddReservationItem 方法。)

您也可以查看ABP的best-practices文档。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?