elsa-workflows/elsa-core · error · ArgumentException

The type does not implement .

Error message

The type {resolverType} does not implement {nameof(ITenantResolver)}.

What it means

The tenant resolution pipeline is built from a list of resolver types that must all implement ITenantResolver. Append(Type) validates this at build time and throws ArgumentException when the supplied type does not implement the interface. This fails fast before the pipeline is ever executed.

Solutions

  1. Make the configured type implement ITenantResolver.
  2. Fix the type name/assembly in configuration so it resolves to an actual resolver.
  3. Use the generic Append<TResolver>() overload where available so the compiler enforces the constraint.

Example fix

// before
pipelineBuilder.Append(typeof(MyResolver)); // MyResolver does not implement ITenantResolver
// after
public class MyResolver : ITenantResolver { /* ... */ }
pipelineBuilder.Append(typeof(MyResolver));
Defensive patterns

Strategy: validation

Validate before calling

if (!typeof(ITenantResolver).IsAssignableFrom(resolverType) || resolverType.IsAbstract)
    throw new ArgumentException($"{resolverType.Name} must be a concrete ITenantResolver implementation.");

Type guard

bool IsValidResolver(Type t) => typeof(ITenantResolver).IsAssignableFrom(t) && !t.IsAbstract;

Try / catch

try
{
    builder.Append(resolverType);
}
catch (ArgumentException ex)
{
    logger.LogError(ex, "Configured tenant resolver {Type} is invalid.", resolverType.Name);
    throw; // fail startup fast
}

Prevention

When it happens

Trigger: Calling ITenantResolverPipelineBuilder.Append(typeof(SomeClass)) where SomeClass (or a type loaded from configuration by name) does not implement ITenantResolver.

Common situations: Configuring resolvers by string type name in appsettings where the string points to the wrong type; refactoring a resolver so it no longer implements ITenantResolver; copy-paste of a host builder configuration with the wrong type.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of elsa-workflows/elsa-core@fe9217bdfa (2026-09-13). Data as JSON: /api/errors/e5888ff9c53ace06. Report an issue: GitHub.

Appendix: source

Thrown at src/modules/Elsa.Tenants/Services/TenantResolutionPipelineBuilder.cs:25

public class TenantResolverPipelineBuilder : ITenantResolverPipelineBuilder
{
    private readonly ISet<Type> _resolvers = new HashSet<Type>();

    /// <inheritdoc />
    public IEnumerable<Type> Resolvers => _resolvers.ToList().AsReadOnly();

    /// <inheritdoc />
    public ITenantResolverPipelineBuilder Append<T>() where T : ITenantResolver
    {
        var strategyType = typeof(T);
        return Append(strategyType);
    }

    /// <inheritdoc />
    public ITenantResolverPipelineBuilder Append(Type resolverType)
    {
        if (typeof(ITenantResolver).IsAssignableFrom(resolverType) == false)
            throw new ArgumentException($"The type {resolverType} does not implement {nameof(ITenantResolver)}.");

        _resolvers.Add(resolverType);
        return this;
    }

    /// <inheritdoc />
    public ITenantResolverPipelineBuilder Clear()
    {
        _resolvers.Clear();
        return this;
    }

    /// <inheritdoc />
    public IEnumerable<ITenantResolver> Build(IServiceProvider serviceProvider)
    {
        return _resolvers
            .Reverse()
            .Select(t => ActivatorUtilities.GetServiceOrCreateInstance(serviceProvider, t))

View on GitHub (pinned to fe9217bdfa)