I don't get it. It is perfectly valid to use immutability and the Type system to enforce those invariants
in c#.
abstract class User {
public string Name { get; }
abstract bool IsActive { get; }
public User(string name) {
this.Name = name;
}
}
class ActiveUser : User {
public ActiveUser(string name) : base(name) { }
private ICollection<Subscription> _subscriptions = new List<Subscription>()
public IEnumerable<Subscription> Subscriptions => _subscriptions;
IsActive => true;
public DeletedUser Delete() => new DeletedUser(Name, DateTime.Now);
public void AddSubscription(Subscription s) => Subscriptions.Add(subscription);
}
class DeletedUser : User {
public DeletedUser(string name) : base(name) { }
public DateTime DeletionDate {get;}
IsActive => false;
public DeletedUser(string name, DateTime deletionDate) : base(name) {
this.DeletionDate = deletionDate;
}
public ActiveUser Reactivate() => new ActiveUser(Name);
}