代码之家  ›  专栏  ›  技术社区  ›  Anyname Donotcare

非聚合根是否可以保存另一个非聚合根的引用?

  •  5
  • Anyname Donotcare  · 技术社区  · 6 年前

    如果我有 two aggregates

    第一次聚合:

    • 工作时间
    • 调节作用

    数据澄清:

    工作时间规定:

     public class WorkTimeRegulation : Entity<Guid>, IAggregateRoot
        {
            private WorkTimeRegulation()//COMB
           : base(Provider.Sql.Create()) // required for EF
            {
            }
            private WorkTimeRegulation(Guid id) : base(id)
            {
                _assignedWorkingTimes = new List<WorkingTime>();
                _enrolledParties = new List<RegulationEnrolment>();
            }
            private readonly List<WorkingTime> _assignedWorkingTimes;
            private readonly List<RegulationEnrolment> _enrolledParties;
            public string Name { get; private set; }
            public byte NumberOfAvailableRotations { get; private set; }
            public bool IsActive { get; private set; }
            public virtual IEnumerable<WorkingTime> AssignedWorkingTimes { get => _assignedWorkingTimes; }
           public virtual IEnumerable<RegulationEnrolment> EnrolledParties { get => _enrolledParties; }
            //...
        }
    

    Id|    Name            |   NumberOfAvailableRotations|  IsActive 
    
     1|    General Rule    |          2                  |    true   
    

    工作时间:

    public class WorkTime : Entity<Guid>
        {
            private WorkTime()
          : base(Provider.Sql.Create()) // required for EF
            {
            }
            private WorkTime(Guid id) : base(id)
            {
                ActivatedWorkingTimes = new List<WorkingTimeActivation>();
            }
            private ICollection<WorkingTimeActivation> _activatedWorkingTimes;
    
            public string Name { get; set; }
            public byte NumberOfHours { get; set; }
            public byte NumberOfShortDays { get; set; }
            public Guid WorkTimeRegulationId { get; private set; }
            public virtual ICollection<WorkingTimeActivation> ActivatedWorkingTimes { get => _activatedWorkingTimes; private set => _activatedWorkingTimes = value; }
            //....
       }
    

    Id|  Name   |   NumberOfHours| NumberOfShortDays |WorkTimeRegulationId 
    
    1 | Winter  |     8          |    1              |    1
    2 | Summer  |     6          |    0              |    1
    

    第二个聚合:

    • 移位(根)
    • 移位细节
    • 移位控制

    数据澄清:

      public class Shift : Entity<Guid>, IAggregateRoot
        {
            private readonly List<ShiftDetail> _assignedShiftDetails;
            private readonly List<ShiftEnrolment> _enrolledParties;
    
    
            public string Name { get; set; }
            public ShiftType ShiftType { get; set; }
            public int WorkTimeRegulationId { get; set; }
            public bool IsDefault { get; set; }
            public virtual WorkingTimeRegulation WorkTimeRegulation { get; set; }
            public virtual IEnumerable<ShiftDetail> AssignedShiftDetails { get => _assignedShiftDetails; }
            public virtual IEnumerable<ShiftEnrolment> EnrolledParties { get => _enrolledParties; }
            //...........
       }
    

    Id|  Name      |  ShiftType  |  WorkTimeRegulationId  | IsDefault 
    1 | IT shift   |  Morning    |    1                   |  1 
    

    移位详细信息:

      public class ShiftDetail : Entity<Guid>
        {
            public Guid ShiftId { get; private set; }
            public Guid WorkTimeId { get; private set; }
            public DateTimeRange ShiftTimeRange { get; private set; }
            public TimeSpan GracePeriodStart { get; private set; }
            public TimeSpan GracePeriodEnd { get; private set; }
            public virtual WorkTime WorkTime { get; private set; }
    
            private ShiftDetail()
            : base(Provider.Sql.Create()) // required for EF
            {
            }
            //..........
       }
    

    ShiftId  WorkTimeId shift-start  shift-end   
      1          1        08:00        16:00
      1          2        08:00        14:00
    

    我的问题是:

    • ShiftDetail )保存参考文献 对于另一个非聚合根( WorkTime
    • 领域专家澄清:要创建一个有效的移位,那么我们 应该有一个 shift detail 为每一个 worktime worktimeRegulation . 无法更新中的工作小时数 工作时间 shiftDetails . 前面的例子表明 有 two worktimes(winter,summer) ,所以我们有一个 shiftdetai l代表 winter 坚持 8 shiftdetail 对于 summer 坚持 6 工作时间 )如何强制这个不变量?

    • 根据前面的信息,我是否犯了与骨料规格相关的错误?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Constantin Galbenu    6 年前

    非聚合根(ShiftDetail)是否可以保存另一个非聚合根(WorkTime)的引用?

    不,除非它们存在于同一个集合中。

    您只能保留对其他聚合根的ID的引用。

    现在我觉得由非聚合根(工作时间)控制的移位细节不变量如何强制这个不变量?

    可以通过两种方式强制实施不变量:

    1. 在集合中。这就是说,这个总数必须足够大,它必须拥有它所需要的所有状态。这种执行是非常一致的。

    2. 由Saga/过程经理协调。此组件对可能的多个聚合中的更改作出反应,并向其他聚合发送命令。传奇是集合的反面。这种执行最终是一致的。