{"record":{"id":"4ab0928ac8d1e90f","repo":"HangfireIO/Hangfire","slug":"filterprovider","errorCode":null,"errorMessage":"filterProvider","messagePattern":"filterProvider","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/Hangfire.Core/Client/BackgroundJobFactory.cs","lineNumber":65,"sourceCode":"                    return factory.RetryAttempts;\n                }\n\n                return 0;\n            }\n            set\n            {\n                if (_innerFactory is CoreBackgroundJobFactory factory)\n                {\n                    factory.RetryAttempts = value;\n                }\n            }\n        }\n\n        internal BackgroundJobFactory(\n            [NotNull] IJobFilterProvider filterProvider, \n            [NotNull] IBackgroundJobFactory innerFactory)\n        {\n            if (filterProvider == null) throw new ArgumentNullException(nameof(filterProvider));\n            if (innerFactory == null) throw new ArgumentNullException(nameof(innerFactory));\n\n            _filterProvider = filterProvider;\n            _innerFactory = innerFactory;\n        }\n\n        public IStateMachine StateMachine => _innerFactory.StateMachine;\n\n        public BackgroundJob Create(CreateContext context)\n        {\n            if (context == null) throw new ArgumentNullException(nameof(context));\n\n            var filterInfo = GetFilters(context.Job);\n\n            try\n            {\n                context.Factory = this;\n","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/HangfireIO/Hangfire/blob/c236dd0f930f831ec151e436e138ddc429a02a72/src/Hangfire.Core/Client/BackgroundJobFactory.cs#L47-L83","documentation":"Thrown by the internal BackgroundJobFactory constructor when filterProvider is null. BackgroundJobFactory decorates a CoreBackgroundJobFactory and resolves IClientFilter instances through IJobFilterProvider before job creation. This guard ensures the filter-discovery step (GetFilters -> _filterProvider.GetFilters(job)) never dereferences null. The internal constructor is used by the public constructor that defaults to JobFilterProviders.Providers and wires a StateMachine.","triggerScenarios":"Calling the internal BackgroundJobFactory(IJobFilterProvider, IBackgroundJobFactory) constructor (via reflection or a friend assembly) with a null filterProvider; a custom IBackgroundJobFactory wrapper that forwards a null provider.","commonSituations":"Subclassing or wrapping BackgroundJobFactory with dependency injection containers that fail to resolve IJobFilterProvider; test fixtures that pass null instead of JobFilterProviders.Providers or a mock provider.","solutions":["Use the parameterless BackgroundJobFactory() constructor or the public one accepting IJobFilterProvider — never the internal constructor.","Register a concrete IJobFilterProvider (e.g., JobFilterProviders.Providers) in your DI container.","In tests, pass a mock/fake IJobFilterProvider (e.g., new EmptyFilterProvider() or JobFilterProviders.Providers)."],"exampleFix":"// before\nvar factory = new BackgroundJobFactory(null);\n\n// after\nvar factory = new BackgroundJobFactory(); // uses JobFilterProviders.Providers\n// or explicitly:\nvar factory = new BackgroundJobFactory(JobFilterProviders.Providers);","handlingStrategy":"validation","validationCode":"var provider = filterProvider ?? JobFilterProviders.Providers;\nvar factory = new BackgroundJobFactory(provider);","typeGuard":"public static bool IsValidFilterProvider(IJobFilterProvider p)\n    => p != null;","tryCatchPattern":null,"preventionTips":["Prefer the parameterless BackgroundJobFactory() constructor in DI registrations.","Register IJobFilterProvider as a singleton pointing at JobFilterProviders.Providers or a scoped provider.","Avoid the internal constructor outside of Hangfire's own assemblies."],"tags":["argument-null","job-factory","filters","di"],"backgroundTag":null,"analyzedSha":"c236dd0f930f831ec151e436e138ddc429a02a72","analyzedAt":"2026-08-13T20:27:11.027Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}