diff --git a/DigitalData.Core.Abstractions/LazyServiceProvider.cs b/DigitalData.Core.Abstractions/LazyServiceProvider.cs new file mode 100644 index 0000000..99a6fdd --- /dev/null +++ b/DigitalData.Core.Abstractions/LazyServiceProvider.cs @@ -0,0 +1,40 @@ +namespace DigitalData.Core.Abstractions; + +/// +/// A deferred implementation of that allows the instance +/// to be provided at a later time via a factory callback. +/// +/// +/// This is particularly useful when service registration requires an instance, +/// but the service provider is not yet available at registration time. +/// By using , a service can safely resolve dependencies once +/// the application's service provider has been built, ensuring a single consistent scope. +/// +public class DeferredServiceProvider : IServiceProvider +{ + private Lazy? _serviceProvider; + + /// + /// Sets the factory that will be used to lazily initialize the instance. + /// + public Func Factory + { + set => _serviceProvider = new(value); + } + + /// + /// Retrieves the requested service object from the deferred . + /// + /// The type of service object to retrieve. + /// The requested service object, or null if the service is not available. + /// + /// Thrown if the service provider factory has not been set before calling . + /// + public object? GetService(Type serviceType) + { + if (_serviceProvider is null) + throw new InvalidOperationException("The service provider has not been initialized. Make sure 'Factory' is set before calling 'GetService'."); + + return _serviceProvider.Value.GetService(serviceType); + } +}