CHR0017: Constraint must not have side effects
Rule Description
Section titled “Rule Description”A class implementing IConstraint must not inject ICommandPipeline or IEventLog via its constructor. Constraints are pure rule builders and must not produce side effects.
Severity
Section titled “Severity”Error
Example
Section titled “Example”Violation
Section titled “Violation”using Cratis.Chronicle.EventSequences;using Cratis.Chronicle.Events.Constraints;
public class UniqueEmailConstraint : IConstraint{ readonly IEventLog _eventLog;
public UniqueEmailConstraint(IEventLog eventLog) { _eventLog = eventLog; }
public void Define(IConstraintBuilder builder) => builder.Unique<UserRegistered>();}using Cratis.Chronicle.Events.Constraints;
public class UniqueEmailConstraint : IConstraint{ public void Define(IConstraintBuilder builder) => builder.Unique<UserRegistered>();}Why This Rule Exists
Section titled “Why This Rule Exists”Constraints declare rules about what combinations of events are valid. They are evaluated by the server in a pure, stateless fashion. Injecting IEventLog or ICommandPipeline implies side effects that cannot be guaranteed to execute at constraint-check time, leading to unpredictable behaviour.