Il dominio viene modificato in base al privilegio dell'utente su campi specifici considerati come anti-pattern?

0

Sta cambiando il dominio in base al privilegio dell'utente su campi specifici considerati come anti-pattern?

Il mio caso:

Ho Schedule Entità (radice aggregata) come questa:

public class Schedule : Entity<Guid>, IAggregateRoot
    {
        private Schedule()
     : base(Provider.Sql.Create()) // required for EF
        {
        }

        public Schedule(Guid id, string name, int workingSystemId, ScheduleType scheduleType) : base(id)
        {
            Name = name;
            WorkingSystemId = workingSystemId ;
            ScheduleType = scheduleType;
            _assignedWeeks = new List<ScheduleDetail>();
            _enrolledParties = new List<ScheduleEnrolment>();
            MaxNumOfInstances = 300;
            NumOfInstances = IsFixed ? 1 : 2;
        }
        private readonly List<ScheduleDetail> _assignedWeeks;
        private readonly List<ScheduleEnrolment> _enrolledParties;

        public string Name { get; set; }
        public int WorkingSystemId { get; set; }
        public ScheduleType ScheduleType { get; set; }
        public int NumOfInstances { get; set; }
        public int MaxNumOfInstances { get; }
        public bool IsDefault { get; set; }
        public bool IsFixed
        {
            get
            {
                return ScheduleType != null && ScheduleType.HasFlag(ScheduleType.Fixed);
            }
        }
        public bool IsFlexible
        {
            get
            {
                return
                    ScheduleType != null && ScheduleType.HasFlag(ScheduleType.Flexible);
            }
        }
        public bool IsFullTime
        {
            get
            {
                return
                    ScheduleType != null && ScheduleType.HasFlag(ScheduleType.FullTime);
            }
        }
        public virtual IEnumerable<ScheduleDetail> AssignedWeeks { get => _assignedWeeks; }
        public virtual IEnumerable<ScheduleEnrolment> EnrolledParties { get => _enrolledParties; }
        public virtual WorkingSystem WorkingSystem{ get; set; }
}

Ora l'esperto di domini spiega che dobbiamo dargli la possibilità di impostare WeekStart ad esempio (l'inizio settimana in questa pianificazione è: Sunday ) e NumberOfWeekends per esempio (NumberOfWeekends in questa pianificazione è: %codice%). E questi due campi critici sono disponibili solo per impostare 2 . ma la creazione di pianificazioni è disponibile per il ruolo role A e deve impostare questi campi durante la creazione della pianificazione!

Sta creando un'altra Entità e la chiamiamo A & B considerata come una decisione sbagliata:

public class WorkingSystem : Entity<Guid>, IAggregateRoot
    {
        private WorkingGroup()//COMB
       : base(Provider.Sql.Create()) // required for EF
        {
        }
        public WorkingGroup(Guid id) : base(id)
        {
            _assignedWorkingTimes = new List<WorkingTime>();
        }

        private readonly ICollection<WorkingTime> _assignedWorkingTimes;

        public string Name { get; private set; }
        public byte NumberOfRotations { get; private set; }
        public Week WeekStart { get; private set; }
        public bool IsActive { get; private set; }
        public bool IsDefault { get; private set; }
        public byte NumberOfWeekends { get; private set; }
        public virtual ICollection<WorkingTime> AssignedWorkingTimes { get => _assignedWorkingTimes; }
 }

Ora la creazione di questa entità è disponibile solo per WorkingSystem .

Come risolvere questo problema?

    
posta Anyname Donotcare 01.09.2018 - 14:23
fonte

1 risposta

3

Autorizzazione (solo gli utenti con "Ruolo A" possono farlo) e la logica aziendale (impostazione di WeekStart e NumberOfWeeks) sono preoccupazioni separate. Il tuo modello di dominio dovrebbe fornire metodi che alterano lo stato del modello in modi validi. Ciò include un metodo che qualcuno con il ruolo A deve solo chiamare.

Spetta al livello dell'applicazione o usa il case layer per determinare quali metodi sul modello di dominio dovrebbero essere chiamati.

Dopo la creazione di un programma, avrai bisogno di un WeekStart e NumberOfWeeks. Questo dovrebbe essere gestito da un costruttore della classe. Ci deve essere un valore predefinito per queste proprietà, quindi scrivi un costruttore che non ti permette di passare quei due valori, e invece li imposta sui valori predefiniti che gli utenti di "ruolo B" avrebbero bisogno.

Se un utente del ruolo A crea una pianificazione, può specificare WeekStart e NumberOfWeeks, quindi crea un altro costruttore che ti permetta di passare quei valori.

Anche in questo caso, i layer caso applicazione o use devono selezionare il costruttore corretto in base ai ruoli dell'utente.

    
risposta data 01.09.2018 - 15:37
fonte