using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using OwofGames.GodotHost; using OwofGames.GodotLume; using OwofGames.GodotLume.Microsoft.DependencyInjection; namespace GodotHostTest.AetherBind; /// /// The base class for a root scope. Implement this class and its abstract methods to kick off the DI system. /// public abstract partial class RootServiceSource : ServiceSource { private Host? _host; private ILogger? _logger; private Host Host { get => _host ?? throw new InvalidOperationException( "Some method of RootScope has been invoked before it entered the tree"); set => _host = value; } private ILogger Logger => _logger ??= Host.GetLogger(); public override void _EnterTree() { // create the host Host = new HostBuilder() .SetServiceCollectionBuilder(InnerConfigure) .SetServiceProviderFactory(new LumeServiceProviderFactory(), Configure) .Build(); // host startup Host.Startup(); // resolve nodes ResolveInjectedNodes(Host.ServiceProvider.GetRequiredService(), null); } public override void _ExitTree() { // async shutdown Host.Shutdown(); } private void InnerConfigure(IServiceCollection serviceCollection) { serviceCollection.AddTransient(); ConfigureServices(serviceCollection); } /// /// Configure the service collection by adding the registrations your game needs. /// /// The builder to enrich with your services. protected abstract void Configure(Builder builder); /// /// Configure the service collection by adding the registrations your game needs. /// /// The service collection to enrich. protected virtual void ConfigureServices(IServiceCollection serviceCollection) { } }