feat(Factory): prevent service modifications after provider is built

Added an `IsBuilt` property and `EnsureNotBuilt()` helper to `Factory` class
to restrict modifications to the service collection once the service provider
has been built. This ensures immutability and prevents runtime inconsistencies
after initialization.
This commit is contained in:
tekh 2025-10-23 09:53:50 +02:00
parent ddbb70081e
commit fbf9488c55

View File

@ -12,9 +12,10 @@ namespace DigitalData.Core.Abstractions
public static readonly Factory Instance = new Factory(); public static readonly Factory Instance = new Factory();
private readonly IServiceCollection _serviceCollection = new ServiceCollection(); private readonly IServiceCollection _serviceCollection = new ServiceCollection();
private readonly Lazy<IServiceProvider> _lazyServiceProvider; private readonly Lazy<IServiceProvider> _lazyServiceProvider;
private bool IsBuilt => _lazyServiceProvider.IsValueCreated;
public Factory() public Factory()
{ {
_serviceCollection = new ServiceCollection(); _serviceCollection = new ServiceCollection();
@ -40,7 +41,11 @@ namespace DigitalData.Core.Abstractions
public ServiceDescriptor this[int index] public ServiceDescriptor this[int index]
{ {
get => _serviceCollection[index]; get => _serviceCollection[index];
set => _serviceCollection[index] = value; set
{
EnsureNotBuilt();
_serviceCollection[index] = value;
}
} }
public int IndexOf(ServiceDescriptor item) public int IndexOf(ServiceDescriptor item)
@ -50,21 +55,25 @@ namespace DigitalData.Core.Abstractions
public void Insert(int index, ServiceDescriptor item) public void Insert(int index, ServiceDescriptor item)
{ {
EnsureNotBuilt();
_serviceCollection.Insert(index, item); _serviceCollection.Insert(index, item);
} }
public void RemoveAt(int index) public void RemoveAt(int index)
{ {
EnsureNotBuilt();
_serviceCollection.RemoveAt(index); _serviceCollection.RemoveAt(index);
} }
public void Add(ServiceDescriptor item) public void Add(ServiceDescriptor item)
{ {
EnsureNotBuilt();
_serviceCollection.Add(item); _serviceCollection.Add(item);
} }
public void Clear() public void Clear()
{ {
EnsureNotBuilt();
_serviceCollection.Clear(); _serviceCollection.Clear();
} }
@ -80,6 +89,7 @@ namespace DigitalData.Core.Abstractions
public bool Remove(ServiceDescriptor item) public bool Remove(ServiceDescriptor item)
{ {
EnsureNotBuilt();
return _serviceCollection.Remove(item); return _serviceCollection.Remove(item);
} }
@ -93,5 +103,13 @@ namespace DigitalData.Core.Abstractions
return (_serviceCollection as IEnumerable).GetEnumerator(); return (_serviceCollection as IEnumerable).GetEnumerator();
} }
#endregion #endregion
#region Helpers
private void EnsureNotBuilt()
{
if (IsBuilt)
throw new InvalidOperationException("Service provider has already been built. No further service modifications are allowed.");
}
#endregion
} }
} }