{"record":{"id":"f09be73ca9eb73e8","repo":"aspnetboilerplate/aspnetboilerplate","slug":"must-set-unitofworkmanager-before-use-it-f09be7","errorCode":null,"errorMessage":"Must set UnitOfWorkManager before use it.","messagePattern":"Must set UnitOfWorkManager before use it\\.","errorType":"exception","errorClass":"AbpException","httpStatus":null,"severity":"error","filePath":"src/Abp/BackgroundJobs/BackgroundJobBase.cs","lineNumber":26,"sourceCode":"namespace Abp.BackgroundJobs\n{\n    public abstract class BackgroundJobBase<TArgs> : IBackgroundJobBase<TArgs>\n    {\n        /// <summary>\n        /// Reference to the setting manager.\n        /// </summary>\n        public ISettingManager SettingManager { protected get; set; }\n\n        /// <summary>\n        /// Reference to <see cref=\"IUnitOfWorkManager\"/>.\n        /// </summary>\n        public IUnitOfWorkManager UnitOfWorkManager\n        {\n            get\n            {\n                if (_unitOfWorkManager == null)\n                {\n                    throw new AbpException(\"Must set UnitOfWorkManager before use it.\");\n                }\n\n                return _unitOfWorkManager;\n            }\n            set { _unitOfWorkManager = value; }\n        }\n\n        private IUnitOfWorkManager _unitOfWorkManager;\n\n        /// <summary>\n        /// Gets current unit of work.\n        /// </summary>\n        protected IActiveUnitOfWork CurrentUnitOfWork\n        {\n            get { return UnitOfWorkManager.Current; }\n        }\n\n        /// <summary>","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/aspnetboilerplate/aspnetboilerplate/blob/2323c13a152aa0ebfb37af3830f687d7f5b53795/src/Abp/BackgroundJobs/BackgroundJobBase.cs#L8-L44","documentation":"BackgroundJobBase.UnitOfWorkManager is lazily accessed via a property that throws AbpException when the backing field is still null. In normal ABP dependency injection the property is property-injected by the framework; hitting this means the job instance was created outside DI (e.g. with 'new') or property injection failed.","triggerScenarios":"Instantiating a BackgroundJob-derived class manually with 'new' instead of resolving it through ABP's IocManager; using the job in a context where ABP's property injection never ran (non-DI factory, unit test constructing the class directly).","commonSituations":"Unit tests new-ing up background jobs without supplying UnitOfWorkManager; custom job activation code bypassing the IocResolver used by BackgroundJobManager.","solutions":["Resolve the job through IIocResolver/IocManager (or let BackgroundJobManager create it) so ABP performs property injection","Explicitly assign UnitOfWorkManager (e.g. from IocManager.Resolve<IUnitOfWorkManager>()) when constructing the job manually in tests","Derive from BackgroundJob<TArgs> and register the job class so the framework injects its dependencies"],"exampleFix":"// before\nvar job = new MyReportJob(); // UnitOfWorkManager never injected\njob.Execute(args);\n// after\nvar job = IocManager.Instance.Resolve<MyReportJob>(); // property-injected\njob.Execute(args);","handlingStrategy":"validation","validationCode":"if (job.UnitOfWorkManager == null)\n    job.UnitOfWorkManager = IocManager.Instance.Resolve<IUnitOfWorkManager>();","typeGuard":"bool CanRun(BackgroundJobBase job) => job.UnitOfWorkManager != null;","tryCatchPattern":"try { job.Execute(args); }\ncatch (AbpException ex) when (ex.Message.Contains(\"Must set UnitOfWorkManager\"))\n{\n    job.UnitOfWorkManager = IocManager.Instance.Resolve<IUnitOfWorkManager>();\n    job.Execute(args);\n}","preventionTips":["Always resolve background jobs via IocManager/BackgroundJobManager, never 'new'","In unit tests, set UnitOfWorkManager explicitly in the fixture setup","Prefer inheriting BackgroundJob<TArgs> so ABP wires dependencies"],"tags":["abp","background-jobs","dependency-injection","unit-of-work"],"backgroundTag":"missing-dependency","analyzedSha":"2323c13a152aa0ebfb37af3830f687d7f5b53795","analyzedAt":"2026-09-08T08:00:50.638Z","contentChangedAt":"2026-09-08T08:00:50.638Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}