T type logging

This commit is contained in:
Alex
2025-01-15 15:06:54 +00:00
parent f9f108448a
commit 8b3305efca
100 changed files with 1229 additions and 761 deletions
+4 -73
View File
@@ -27,8 +27,8 @@ public static class Program
ProgramStatics.Initialize();
RegisterSptComponents(builder.Services);
RegisterModOverrideComponents(builder.Services, assemblies);
DependencyInjectionRegistrator.RegisterSptComponents(builder.Services);
DependencyInjectionRegistrator.RegisterModOverrideComponents(builder.Services, assemblies);
ILogger logger = new SerilogLoggerProvider(registeredLogger).CreateLogger("Server");
try
{
@@ -64,8 +64,8 @@ public static class Program
// throw ex;
}
}
private static void CreateAndRegisterLogger(WebApplicationBuilder builder, out Serilog.Core.Logger logger)
public static void CreateAndRegisterLogger(WebApplicationBuilder builder, out Serilog.Core.Logger logger)
{
builder.Logging.ClearProviders();
logger = new LoggerConfiguration()
@@ -77,73 +77,4 @@ public static class Program
.CreateLogger();
builder.Logging.AddSerilog(logger);
}
private static void RegisterModOverrideComponents(IServiceCollection builderServices, List<Assembly> assemblies)
{
// We get all the services from this assembly first, since mods will override them later
RegisterComponents(builderServices, assemblies.SelectMany(a => a.GetTypes())
.Where(type => Attribute.IsDefined(type, typeof(Injectable))));
}
private static void RegisterComponents(IServiceCollection builderServices, IEnumerable<Type> types)
{
var groupedTypes = types.SelectMany(t =>
{
var attributes = (Injectable[]) Attribute.GetCustomAttributes(t, typeof(Injectable))!;
var registerableType = t;
var registerableComponents = new List<RegisterableType>();
foreach (var attribute in attributes)
{
// if we have a type override this takes priority
if (attribute.InjectableTypeOverride != null)
{
registerableType = attribute.InjectableTypeOverride;
}
// if this class only has 1 interface we register it on that interface
else if (registerableType.GetInterfaces().Length == 1)
{
registerableType = registerableType.GetInterfaces()[0];
}
registerableComponents.Add(new(registerableType, t, attribute));
}
return registerableComponents;
}).GroupBy(t => t.RegisterableInterface.FullName);
// We get all injectable services to register them on our services
foreach (var groupedInjectables in groupedTypes)
{
foreach (var valueTuple in groupedInjectables.OrderBy(t => t.InjectableAttribute.TypePriority))
{
switch (valueTuple.InjectableAttribute.InjectionType)
{
case InjectionType.Singleton:
builderServices.AddSingleton(valueTuple.RegisterableInterface, valueTuple.TypeToRegister);
break;
case InjectionType.Transient:
builderServices.AddTransient(valueTuple.RegisterableInterface, valueTuple.TypeToRegister);
break;
case InjectionType.Scoped:
builderServices.AddScoped(valueTuple.RegisterableInterface, valueTuple.TypeToRegister);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}
private static void RegisterSptComponents(IServiceCollection builderServices)
{
// We get all the services from this assembly first, since mods will override them later
RegisterComponents(builderServices, typeof(Program).Assembly.GetTypes()
.Where(type => Attribute.IsDefined(type, typeof(Injectable))));
RegisterComponents(builderServices, typeof(App).Assembly.GetTypes()
.Where(type => Attribute.IsDefined(type, typeof(Injectable))));
}
class RegisterableType(Type registerableInterface, Type typeToRegister, Injectable injectableAttribute)
{
public Type RegisterableInterface { get; } = registerableInterface;
public Type TypeToRegister { get; } = typeToRegister;
public Injectable InjectableAttribute { get; } = injectableAttribute;
}
}