global using NitroxModel.Logger; using System; using System.Reflection; using Autofac; using NitroxModel.Core; using NitroxModel.Networking; using NitroxServer.Communication.LiteNetLib; using NitroxServer.Communication.Packets; using NitroxServer.Communication.Packets.Processors; using NitroxServer.Communication.Packets.Processors.Abstract; using NitroxServer.ConsoleCommands.Abstract; using NitroxServer.ConsoleCommands.Processor; using NitroxServer.Serialization.Upgrade; using NitroxServer.Serialization.World; namespace NitroxServer { public class ServerAutoFacRegistrar : IAutoFacRegistrar { public virtual void RegisterDependencies(ContainerBuilder containerBuilder) { RegisterCoreDependencies(containerBuilder); RegisterWorld(containerBuilder); RegisterGameSpecificServices(containerBuilder, Assembly.GetCallingAssembly()); RegisterGameSpecificServices(containerBuilder, Assembly.GetExecutingAssembly()); } private static void RegisterCoreDependencies(ContainerBuilder containerBuilder) { // TODO: Remove this once .NET Generic Host is implemented containerBuilder.Register(c => Server.CreateOrLoadConfig()).SingleInstance(); containerBuilder.RegisterType().SingleInstance(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().SingleInstance(); containerBuilder.RegisterType() .As() .SingleInstance(); containerBuilder.RegisterType().SingleInstance(); } private void RegisterWorld(ContainerBuilder containerBuilder) { containerBuilder.RegisterType().SingleInstance(); // TODO: Remove this once .NET Generic Host is implemented containerBuilder.Register(c => c.Resolve().Load(Server.GetSaveName(Environment.GetCommandLineArgs(), "My World"))).SingleInstance(); containerBuilder.Register(c => c.Resolve().BuildingManager).SingleInstance(); containerBuilder.Register(c => c.Resolve().TimeKeeper).SingleInstance(); containerBuilder.Register(c => c.Resolve().PlayerManager).SingleInstance(); containerBuilder.Register(c => c.Resolve().StoryManager).SingleInstance(); containerBuilder.Register(c => c.Resolve().ScheduleKeeper).SingleInstance(); containerBuilder.Register(c => c.Resolve().SimulationOwnershipData).SingleInstance(); containerBuilder.Register(c => c.Resolve().WorldEntityManager).SingleInstance(); containerBuilder.Register(c => c.Resolve().EntityRegistry).SingleInstance(); containerBuilder.Register(c => c.Resolve().EntitySimulation).SingleInstance(); containerBuilder.Register(c => c.Resolve().EscapePodManager).SingleInstance(); containerBuilder.Register(c => c.Resolve().BatchEntitySpawner).SingleInstance(); containerBuilder.Register(c => c.Resolve().GameData).SingleInstance(); containerBuilder.Register(c => c.Resolve().GameData.PDAState).SingleInstance(); containerBuilder.Register(c => c.Resolve().GameData.StoryGoals).SingleInstance(); containerBuilder.Register(c => c.Resolve().GameData.StoryTiming).SingleInstance(); containerBuilder.Register(c => c.Resolve().SessionSettings).SingleInstance(); } private void RegisterGameSpecificServices(ContainerBuilder containerBuilder, Assembly assembly) { containerBuilder .RegisterAssemblyTypes(assembly) .AssignableTo() .As() .InstancePerLifetimeScope(); containerBuilder .RegisterAssemblyTypes(assembly) .AsClosedTypesOf(typeof(AuthenticatedPacketProcessor<>)) .InstancePerLifetimeScope(); containerBuilder .RegisterAssemblyTypes(assembly) .AsClosedTypesOf(typeof(UnauthenticatedPacketProcessor<>)) .InstancePerLifetimeScope(); containerBuilder .RegisterAssemblyTypes(assembly) .AssignableTo() .As() .InstancePerLifetimeScope(); } } }