{"record":{"id":"d571d88d7ddf9f83","repo":"abpframework/abp","slug":"concerns-should-be-provided","errorCode":null,"errorMessage":"concerns should be provided!","messagePattern":"concerns should be provided!","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"warning","filePath":"framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs","lineNumber":20,"sourceCode":"using System.Collections.Generic;\nusing JetBrains.Annotations;\n\nnamespace Volo.Abp.Aspects;\n\npublic static class AbpCrossCuttingConcerns\n{\n    //TODO: Move these constants to their own assemblies!\n\n    public const string Auditing = \"AbpAuditing\";\n    public const string UnitOfWork = \"AbpUnitOfWork\";\n    public const string FeatureChecking = \"AbpFeatureChecking\";\n    public const string GlobalFeatureChecking = \"AbpGlobalFeatureChecking\";\n\n    public static void AddApplied(object obj, params string[] concerns)\n    {\n        if (concerns.IsNullOrEmpty())\n        {\n            throw new ArgumentNullException(nameof(concerns), $\"{nameof(concerns)} should be provided!\");\n        }\n\n        (obj as IAvoidDuplicateCrossCuttingConcerns)?.AppliedCrossCuttingConcerns.AddRange(concerns);\n    }\n\n    public static void RemoveApplied(object obj, params string[] concerns)\n    {\n        if (concerns.IsNullOrEmpty())\n        {\n            throw new ArgumentNullException(nameof(concerns), $\"{nameof(concerns)} should be provided!\");\n        }\n\n        var crossCuttingEnabledObj = obj as IAvoidDuplicateCrossCuttingConcerns;\n        if (crossCuttingEnabledObj == null)\n        {\n            return;\n        }\n","sourceCodeStart":2,"sourceCodeEnd":38,"githubUrl":"https://github.com/abpframework/abp/blob/7ed43b1931b9df46a50c0c59148a18645641d0df/framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs#L2-L38","documentation":"AbpCrossCuttingConcerns.AddApplied tags an object (implementing IAvoidDuplicateCrossCuttingConcerns) with applied concern names like AbpAuditing / AbpUnitOfWork so interceptors do not run the same concern twice. The params string[] concerns array must be non-null and non-empty; passing none is treated as a programming error (ArgumentNullException). This is internal infrastructure invoked by ABP's auditing/UoW/feature interceptors.","triggerScenarios":"Calling AddApplied(obj) with no concern arguments, or explicitly passing a null/empty string array.","commonSituations":"A custom interceptor that calls AddApplied(obj) without specifying which concern; a refactor that drops a concern constant; calling Applying(obj) (which forwards to AddApplied) with no concerns.","solutions":["Pass at least one concern constant, e.g. AddApplied(obj, AbpCrossCuttingConcerns.Auditing).","If building the array dynamically, guard for null/empty before calling.","Prefer the Applying(obj, concerns...) helper which also removes on dispose - and pass real concern names."],"exampleFix":"// before\nAbpCrossCuttingConcerns.AddApplied(obj); // throws\n\n// after\nAbpCrossCuttingConcerns.AddApplied(obj, AbpCrossCuttingConcerns.Auditing);","handlingStrategy":"validation","validationCode":"if (concerns is null || concerns.Length == 0) return;\nAbpCrossCuttingConcerns.AddApplied(obj, concerns);","typeGuard":"bool HasConcerns(string[] c) => c is not null && c.Length > 0;","tryCatchPattern":null,"preventionTips":["Always pass at least one named concern constant when calling AddApplied/Applying.","Guard dynamically-built arrays for null/empty before forwarding.","Prefer the Applying(obj, concerns...) helper so Add+Remove are paired and named."],"tags":["cross-cutting-concerns","interceptor","argument"],"backgroundTag":null,"analyzedSha":"7ed43b1931b9df46a50c0c59148a18645641d0df","analyzedAt":"2026-08-13T16:26:11.351Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}