---
title: 'CHR0017: Constraint must not have side effects'
---

## 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

Error

## Example

### Violation

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

### Fix

```csharp
using Cratis.Chronicle.Events.Constraints;

public class UniqueEmailConstraint : IConstraint
{
    public void Define(IConstraintBuilder builder) =>
        builder.Unique<UserRegistered>();
}
```

## 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.

## Related Rules

- [CHR0018](/chronicle/code-analysis/chr0018/): Constraint Define() must not contain imperative code
- [CHR0015](/chronicle/code-analysis/chr0015/): Projection must not have side effects
