mirror of
https://github.com/AlexMacocian/SystemExtensions.git
synced 2026-07-15 14:19:29 +00:00
e6a06915cd
Codestyle fixes Setup CODEOWNERS Setup dependabot
50 lines
1.7 KiB
C#
50 lines
1.7 KiB
C#
using Microsoft.Extensions.Logging;
|
|
using Slim.Resolvers;
|
|
using System.Linq;
|
|
|
|
namespace System.Logging;
|
|
|
|
public sealed class LoggerResolver : IDependencyResolver
|
|
{
|
|
public bool CanResolve(Type type)
|
|
{
|
|
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ILogger<>) ||
|
|
type == typeof(ILogger))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public object Resolve(Slim.IServiceProvider serviceProvider, Type type)
|
|
{
|
|
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ILogger<>))
|
|
{
|
|
return ResolveScopedLogger(serviceProvider, type);
|
|
}
|
|
else if (type == typeof(ILogger))
|
|
{
|
|
return ResolveLogger(serviceProvider);
|
|
}
|
|
else
|
|
{
|
|
throw new InvalidOperationException($"{nameof(LoggerResolver)} cannot resolve an object of type {type.Name}");
|
|
}
|
|
}
|
|
|
|
private static object ResolveScopedLogger(Slim.IServiceProvider serviceProvider, Type type)
|
|
{
|
|
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
|
|
var categoryTypes = type.GetGenericArguments();
|
|
var createLoggerMethod = typeof(LoggerFactoryExtensions).GetMethods().Where(m => m.IsGenericMethodDefinition && m.Name == nameof(LoggerFactoryExtensions.CreateLogger)).First();
|
|
return createLoggerMethod.MakeGenericMethod(categoryTypes.First()).Invoke(null, new object[] { loggerFactory });
|
|
}
|
|
|
|
private static object ResolveLogger(Slim.IServiceProvider serviceProvider)
|
|
{
|
|
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
|
|
return loggerFactory.CreateLogger(string.Empty);
|
|
}
|
|
}
|