I have a class Document
and document has a status:
public enum DocumentStatus : byte
{
Incompleted,
Completed,
Cancelled
}
Now I have a dilemma I can't solve alone.
Should Document
have methods like Cancel
and Complete
and domain events like DocumentCancelled
and DocumentCompleted
public class Document : Entity, IAggregateRoot
{
...
public DocumentStatus Status { get; private set; }
public void Cancel()
{
Status = DocumentStatus.Cancelled;
this.AddDomainEvent(new DocumentCancelled(this));
}
public void Complete()
{
Status = DocumentStatus.Completed;
this.AddDomainEvent(new DocumentCompleted(this));
}
}
Or would it also be fine to make Status
setter public and have domain event like DocumentStatusChanged
?
public class Document : Entity, IAggregateRoot
{
...
private DocumentStatus _status;
public DocumentStatus Status
{
get => _status;
set {
this.AddDomainEvent(new DocumentStatusChanged(this, _status, value)); // oldValue, newValue
_status = value;
}
}
}
In this case is this better than using a method like:
public class Document : Entity, IAggregateRoot
{
...
public DocumentStatus Status { get; private set; }
public void SetDocumentStatus(DocumentStatus status)
{
this.AddDomainEvent(new DocumentStatusChanged(this, Status, status)); // oldValue, newValue
Status = status;
}
}
Sorry if this sounds trivial or stupid but I'm new to DDD and trying to follow the best practices.