From b41373339e18d78782eb044b692a81fd6e50d7c0 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 28 Apr 2025 14:56:25 +0200 Subject: [PATCH] =?UTF-8?q?feat(core):=20DeferredServiceProvider=20f=C3=BC?= =?UTF-8?q?r=20verz=C3=B6gerte=20IServiceProvider-Initialisierung=20hinzug?= =?UTF-8?q?ef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LazyServiceProvider.cs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 DigitalData.Core.Abstractions/LazyServiceProvider.cs 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); + } +}