Skip to content

CHR0017: Constraint must not have side effects

A class implementing IConstraint must not inject ICommandPipeline or IEventLog via its constructor. Constraints are pure rule builders and must not produce side effects.

Error

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>();
}

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.

  • CHR0018: Constraint Define() must not contain imperative code
  • CHR0015: Projection must not have side effects