如何解决如何在 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 举报,一经查实,本站将立刻删除。