Witam,
potrzebuję pomocy w odpowiednim zamodelowaniu agregatu, jakim jest akceptacja zadania. Wyróżniamy wiele typów zadań np. akceptacja polisy, akceptacja anulacji polisy itd. W zależności od typu operacji, zadanie musi być zaakceptowane przez 1, 2 lub więcej osób. Jest to w pełni konfigurowalne, a samo sprawdzanie odbywa się po Roli, lub po konkretnym użytkowniku.
Przykładowo: żeby zadanie zostało zaakceptowano musi pójść approve od kogoś z rolą administrator, lub od użytkownika Jan Kowalski. Tego typu warunku można ze sobą dowolnie łączyć przez grupowanie działań w nawisach i operatory "lub", "i".
Mam jednak problem z zamodelowaniem zadania do akceptacji
Czy agregat powinien wiedzieć o konfiguracji warunków do spełnienia? Czy mogą mu być one dostarczone do metody Accept w postaci obiektu działaniem przypominającym wzorzec specyfikacji? Głównym problemem jest to, że najpierw muszę sprawdzić czy wpadła pojedyncza akceptacja, a później czy całe zadanie można zaakceptować.
Poniżej wklejam roboczy kod.
public Result Accept(AcceptanceRequirements requirements, Approver approver)
{
if (!requirements.CanApprove(approver))
{
return new CannotApproveFailure();
}
AddApprovalBy(approver);
_events.Add(new ApprovalAddedToTaskEvent(approver.Id));
if (requirements.AllAcceptanceConditionsMet(this))
{
MarkAsAccepted();
_events.Add(new TaskAcceptedEvent());
}
return Result.Success();
}
Gdyby do akceptacji była wymagana tylko jedna osoba, bez żadnych dodatkowych warunków, to w agregacie trzymałbym informację o tym kto musi zatwierdzić dane zadanie. Tutaj jednak warunki akceptacji są skomplikowane, dlatego widzę je jako odrębny byt, który mogę zserializowany zapisac w bazie, a następnie odtworzyć w postaci specyfikacji.
Jak Wy byście podeszli do tego zadania?
Pozdrawiam