{"record":{"id":"817668f7465511c9","repo":"stride3d/stride","slug":"cannot-register-a-service-on-a-nullserviceprovider","errorCode":null,"errorMessage":"Cannot register a service on a NullServiceProvider.","messagePattern":"Cannot register a service on a NullServiceProvider\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/presentation/Stride.Core.Presentation/ViewModels/NullServiceProvider.cs","lineNumber":24,"sourceCode":"/// <summary>\n/// A service provider that is empty and immutable.\n/// </summary>\ninternal sealed class NullServiceProvider : IViewModelServiceProvider\n{\n    // We provide an empty `add' and `remove' to avoid a warning about unused events that we have\n    // to implement as they are part of the IViewModelServiceProvider definition.\n    /// <inheritdoc/>\n    public event EventHandler<ServiceRegistrationEventArgs>? ServiceRegistered { add { } remove { } }\n\n    // We provide an empty `add' and `remove' to avoid a warning about unused events that we have\n    // to implement as they are part of the IViewModelServiceProvider definition.\n    /// <inheritdoc/>\n    public event EventHandler<ServiceRegistrationEventArgs>? ServiceUnregistered { add { } remove { } }\n\n    /// <inheritdoc/>\n    public void RegisterService(object service)\n    {\n        throw new InvalidOperationException(\"Cannot register a service on a NullServiceProvider.\");\n    }\n\n    /// <inheritdoc/>\n    public void UnregisterService(object service)\n    {\n        throw new InvalidOperationException(\"Cannot unregister a service on a NullServiceProvider.\");\n    }\n\n    /// <inheritdoc/>\n    public object? TryGet(Type serviceType)\n    {\n        return null;\n    }\n\n    /// <inheritdoc/>\n    public T? TryGet<T>() where T : class\n    {\n        return null;","sourceCodeStart":6,"sourceCodeEnd":42,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/presentation/Stride.Core.Presentation/ViewModels/NullServiceProvider.cs#L6-L42","documentation":"NullServiceProvider is a placeholder IViewModelServiceProvider whose TryGet always returns null; it is meant for view models that need no services. Since it can never resolve services, registering one on it is meaningless, so RegisterService throws InvalidOperationException to reject the misuse explicitly.","triggerScenarios":"Calling RegisterService on NullServiceProvider directly, or on a ViewModelProvider/ViewModelBase wired to the null provider while attempting to add a service at runtime.","commonSituations":"Code that builds view models with the null provider in tests and later tries to attach services; a config path that fell back to NullServiceProvider unexpectedly; forgetting to swap in a real provider before registration.","solutions":["Use a real ViewModelServiceProvider instead of NullServiceProvider when services are needed","Register services during provider construction, not on NullServiceProvider","Audit why a null provider was selected (default/fallback logic)","Assert the provider type before calling RegisterService"],"exampleFix":"// before\nIViewModelServiceProvider provider = NullServiceProvider.Instance;\nprovider.RegisterService(new MyService()); // throws\n// after\nIViewModelServiceProvider provider = new ViewModelServiceProvider(new MyService());","handlingStrategy":"type-guard","validationCode":"if (provider is NullServiceProvider)\n    throw new InvalidOperationException(\"Cannot register services on NullServiceProvider; use a real provider.\");","typeGuard":"static bool SupportsRegistration(IViewModelServiceProvider p) => p is not NullServiceProvider;","tryCatchPattern":"try { provider.RegisterService(service); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"NullServiceProvider\")) { /* swap in a real provider */ }","preventionTips":["Only use NullServiceProvider for service-free view models","Register services at provider construction time","Never share disposal/registration code paths between null and real providers"],"tags":["service-provider","null-object","register","viewmodel"],"backgroundTag":"unsupported-operation","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}