|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace System.ComponentModel.Design;
/// <summary>
/// A service container that supports "fixed" services. Fixed services cannot be removed.
/// </summary>
internal sealed class DesignSurfaceServiceContainer : ServiceContainer
{
private readonly HashSet<Type> _fixedServices = [];
/// <summary>
/// We always add ourselves as a service.
/// </summary>
internal DesignSurfaceServiceContainer(IServiceProvider? parentProvider) : base(parentProvider)
{
AddFixedService(typeof(DesignSurfaceServiceContainer), this);
}
/// <summary>
/// Removes the given service type from the service container.
/// </summary>
internal void AddFixedService(Type serviceType, object serviceInstance)
{
AddService(serviceType, serviceInstance);
_fixedServices.Add(serviceType);
}
/// <summary>
/// Removes a previously added fixed service.
/// </summary>
internal void RemoveFixedService(Type serviceType)
{
_fixedServices.Remove(serviceType);
RemoveService(serviceType);
}
/// <summary>
/// Removes the given service type from the service container. Throws an exception if the service is fixed.
/// </summary>
public override void RemoveService(Type serviceType, bool promote)
{
if (serviceType is not null && _fixedServices.Contains(serviceType))
{
throw new InvalidOperationException(string.Format(SR.DesignSurfaceServiceIsFixed, serviceType.Name));
}
base.RemoveService(serviceType!, promote);
}
}
|