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
- Make the configured type implement ITenantResolver.
- Fix the type name/assembly in configuration so it resolves to an actual resolver.
- 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
- Use the generic Append<T>() overload so the compiler enforces the constraint.
- When resolving types from configuration strings, validate with typeof checks at startup.
- Add a startup smoke test that builds the pipeline before serving traffic.
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
- A configuration key is required.
- A configured default role no longer exists.
- A workflow definition or artifact-relative path is required.
- Adapter ' ' does not provide a settings migration from…
- Adapter ' ' has an invalid settings migration from version…
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)