{"record":{"id":"bf07824d2fccaf21","repo":"LuckyPennySoftware/MediatR","slug":"implementationtype-name-must-implement-typeof-i","errorCode":null,"errorMessage":"{implementationType.Name} must implement {typeof(IPipelineBehavior<,>).FullName}","messagePattern":"(.+?) must implement (.+?)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/MediatR/MicrosoftExtensionsDI/MediatrServiceConfiguration.cs","lineNumber":177,"sourceCode":"    /// <returns>This</returns>\r\n    public MediatRServiceConfiguration AddBehavior<TImplementationType>(ServiceLifetime serviceLifetime = ServiceLifetime.Transient)\r\n    {\r\n        return AddBehavior(typeof(TImplementationType), serviceLifetime);\r\n    }\r\n\r\n    /// <summary>\r\n    /// Register a closed behavior type against all <see cref=\"IPipelineBehavior{TRequest,TResponse}\"/> implementations\r\n    /// </summary>\r\n    /// <param name=\"implementationType\">Closed behavior implementation type</param>\r\n    /// <param name=\"serviceLifetime\">Optional service lifetime, defaults to <see cref=\"ServiceLifetime.Transient\"/>.</param>\r\n    /// <returns>This</returns>\r\n    public MediatRServiceConfiguration AddBehavior(Type implementationType, ServiceLifetime serviceLifetime = ServiceLifetime.Transient)\r\n    {\r\n        var implementedGenericInterfaces = implementationType.FindInterfacesThatClose(typeof(IPipelineBehavior<,>)).ToList();\r\n\r\n        if (implementedGenericInterfaces.Count == 0)\r\n        {\r\n            throw new InvalidOperationException($\"{implementationType.Name} must implement {typeof(IPipelineBehavior<,>).FullName}\");\r\n        }\r\n\r\n        foreach (var implementedBehaviorType in implementedGenericInterfaces)\r\n        {\r\n            BehaviorsToRegister.Add(new ServiceDescriptor(implementedBehaviorType, implementationType, serviceLifetime));\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    /// <summary>\r\n    /// Register a closed behavior type\r\n    /// </summary>\r\n    /// <param name=\"serviceType\">Closed behavior interface type</param>\r\n    /// <param name=\"implementationType\">Closed behavior implementation type</param>\r\n    /// <param name=\"serviceLifetime\">Optional service lifetime, defaults to <see cref=\"ServiceLifetime.Transient\"/>.</param>\r\n    /// <returns>This</returns>\r\n    public MediatRServiceConfiguration AddBehavior(Type serviceType, Type implementationType, ServiceLifetime serviceLifetime = ServiceLifetime.Transient)\r","sourceCodeStart":159,"sourceCodeEnd":195,"githubUrl":"https://github.com/LuckyPennySoftware/MediatR/blob/916ef1b3d68ccdc96db8f914eaf1b32fc7db52c5/src/MediatR/MicrosoftExtensionsDI/MediatrServiceConfiguration.cs#L159-L195","documentation":"AddBehavior(Type, ServiceLifetime) inspects the type via FindInterfacesThatClose(IPipelineBehavior<,>) and throws InvalidOperationException when none are found, so only valid closed pipeline behaviors are registered against IPipelineBehavior<TRequest,TResponse>.","triggerScenarios":"Passing a Type to AddBehavior that does not implement IPipelineBehavior<TRequest,TResponse> — e.g. an IStreamPipelineBehavior, a request pre/post-processor, or an unrelated class.","commonSituations":"Confusing request pipeline behaviors with stream pipeline behaviors; registering an open generic via AddBehavior instead of AddOpenBehavior; registering a class that only implements a marker interface.","solutions":["Ensure the type implements IPipelineBehavior<TRequest, TResponse>.","For stream pipelines use AddStreamBehavior / IStreamPipelineBehavior<,>.","For open-generic behaviors use AddOpenBehavior(typeof(Foo<,>))."],"exampleFix":"// before\n// LoggingBehavior implements IStreamPipelineBehavior<,>\nconfiguration.AddBehavior(typeof(LoggingBehavior<,>));\n// after\nconfiguration.AddStreamBehavior(typeof(LoggingBehavior<,>));","handlingStrategy":"validation","validationCode":"var closes = implementationType.FindInterfacesThatClose(typeof(IPipelineBehavior<,>)).ToList();\nif (closes.Count == 0)\n    throw new InvalidOperationException($\"{implementationType.Name} is not a closed IPipelineBehavior<,>.\");","typeGuard":"static bool IsClosedPipelineBehavior(Type t) =>\n    t.FindInterfacesThatClose(typeof(IPipelineBehavior<,>)).Any();","tryCatchPattern":null,"preventionTips":["Confirm the type implements IPipelineBehavior<TRequest, TResponse>.","Use AddStreamBehavior for IStreamPipelineBehavior and AddOpenBehavior for open generics."],"tags":["pipeline-behavior","registration","di","type-validation"],"backgroundTag":null,"analyzedSha":"916ef1b3d68ccdc96db8f914eaf1b32fc7db52c5","analyzedAt":"2026-08-13T17:57:04.476Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}