stride3d/stride · error · ArgumentNullException

ArgumentNullException: dependencyManager

Error message

ArgumentNullException: dependencyManager

What it means

FixAssetReferencesViewModel's constructor requires an IAssetDependencyManager and throws ArgumentNullException when it is null; the manager is stored and used to find assets referencing deleted objects.

Solutions

  1. Pass the active IAssetDependencyManager instance from the editor's session
  2. Resolve the dependency manager via IServiceProvider before constructing
  3. Register the dependency analysis service if it is missing

Example fix

// before
new FixAssetReferencesViewModel(serviceProvider, deleted, dependencyManager, dialog);
// after
dependencyManager ??= serviceProvider.Get<IAssetDependencyManager>();
new FixAssetReferencesViewModel(serviceProvider, deleted, dependencyManager, dialog);
Defensive patterns

Strategy: validation

Validate before calling

dependencyManager ??= serviceProvider.Get<IAssetDependencyManager>();
if (dependencyManager == null) throw new InvalidOperationException("IAssetDependencyManager not registered");
var vm = new FixAssetReferencesViewModel(sp, deletedObjects, dependencyManager, dialog);

Type guard

static bool HasDependencyManager([NotNullWhen(true)] IAssetDependencyManager? m) => m is not null;

Try / catch

try { vm = new FixAssetReferencesViewModel(sp, deleted, mgr, dialog); } catch (ArgumentNullException ex) { logger.LogError(ex, "Dependency manager missing"); throw; }

Prevention

When it happens

Trigger: Constructing FixAssetReferencesViewModel(serviceProvider, deletedObjects, dependencyManager, dialog) with dependencyManager == null.

Common situations: The asset dependency service was not registered in the service provider / not resolved before opening the Fix Asset References view.

Related errors


AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14). Data as JSON: /api/errors/42fda3a6605e6335. Report an issue: GitHub.

Appendix: source

Thrown at sources/editor/Stride.Core.Assets.Editor/Components/FixAssetReferences/FixAssetReferencesViewModel.cs:28

using Stride.Core.Assets.Editor.ViewModel;
using Stride.Core.Assets.Quantum;
using Stride.Core.Annotations;
using Stride.Core.Extensions;
using Stride.Core.Presentation.Services;
using Stride.Core.Quantum;
using Stride.Core.Presentation.ViewModels;

namespace Stride.Core.Assets.Editor.Components.FixAssetReferences
{
    public class FixAssetReferencesViewModel : FixReferencesViewModel<AssetViewModel>
    {
        private readonly IAssetDependencyManager dependencyManager;
        private readonly HashSet<AssetId> hashIds;

        public FixAssetReferencesViewModel([NotNull] IViewModelServiceProvider serviceProvider, [ItemNotNull, NotNull] IEnumerable<AssetViewModel> deletedObjects, [NotNull] IAssetDependencyManager dependencyManager, [NotNull] IFixReferencesDialog dialog)
            : base(serviceProvider, dialog)
        {
            if (dependencyManager == null) throw new ArgumentNullException(nameof(dependencyManager));
            this.dependencyManager = dependencyManager;
            hashIds = new HashSet<AssetId>();
            hashIds.AddRange(deletedObjects.Select(x => x.Id));
        }

        protected override IEnumerable<KeyValuePair<object, List<AssetViewModel>>> FindReferencers(AssetViewModel deletedObject)
        {
            var session = deletedObject.Session;
            var dependencies = dependencyManager.ComputeDependencies(deletedObject.AssetItem.Id, AssetDependencySearchOptions.In, ContentLinkType.Reference);
            var referencers = dependencies?.LinksIn.Select(x => session.GetAssetById(x.Item.Id)).NotNull().Where(x => !hashIds.Contains(x.Id)).ToList() ?? new List<AssetViewModel>();
            yield return new KeyValuePair<object, List<AssetViewModel>>(deletedObject, referencers);
        }

        protected override IEnumerable<ReferenceReplacementViewModel<AssetViewModel>> GetReplacementsForReferencer(AssetViewModel referencer, object referencedMember)
        {
            var rootNode = SessionViewModel.Instance.AssetNodeContainer.GetNode(referencer.Asset);
            var visitor = new GraphVisitorBase { SkipRootNode = true };
            var result = new List<ReferenceReplacementViewModel<AssetViewModel>>();

View on GitHub (pinned to 96fad776d2)