-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathLoggingExtension.cs
99 lines (71 loc) · 2.79 KB
/
LoggingExtension.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using Microsoft.Extensions.Logging;
using System;
using System.Reflection;
using System.Security;
using Unity.Builder;
using Unity.Extension;
using Unity.Policy;
using Unity.Resolution;
namespace Unity.Microsoft.Logging
{
[SecuritySafeCritical]
public class LoggingExtension : UnityContainerExtension
{
#region Fields
private delegate object GenericLoggerFactory(ILoggerFactory factory);
private static readonly MethodInfo CreateLoggerMethod =
typeof(LoggingExtension).GetTypeInfo()
.GetDeclaredMethod(nameof(CreateLogger));
#endregion
#region Constructors
[InjectionConstructor]
public LoggingExtension()
: this(new LoggerFactory())
{ }
public LoggingExtension(ILoggerFactory factory)
{
LoggerFactory = factory ?? new LoggerFactory();
}
#endregion
#region Public Members
public ILoggerFactory LoggerFactory { get; }
#endregion
#region UnityContainerExtension
protected override void Initialize()
{
Context.Policies.Set(typeof(ILogger), UnityContainer.All, typeof(ResolveDelegateFactory), (ResolveDelegateFactory)GetResolver);
Context.Policies.Set(typeof(ILogger<>), UnityContainer.All, typeof(ResolveDelegateFactory), (ResolveDelegateFactory)GetResolverGeneric);
Container.RegisterFactory(typeof(ILoggerFactory), UnityContainer.All, (c, t, n) => LoggerFactory, FactoryLifetime.Singleton);
}
#endregion
#region IResolveDelegateFactory
public ResolveDelegate<BuilderContext> GetResolver(ref BuilderContext context)
{
return ((ref BuilderContext c) =>
{
Type declaringType = c.DeclaringType;
return null == declaringType
? LoggerFactory.CreateLogger(c.Name ?? UnityContainer.All)
: LoggerFactory.CreateLogger(declaringType);
});
}
public ResolveDelegate<BuilderContext> GetResolverGeneric(ref BuilderContext context)
{
var itemType = context.Type.GetTypeInfo().GenericTypeArguments[0];
var buildMethod = (GenericLoggerFactory)CreateLoggerMethod.MakeGenericMethod(itemType)
.CreateDelegate(typeof(GenericLoggerFactory));
return ((ref BuilderContext c) =>
{
c.Existing = buildMethod(LoggerFactory);
return c.Existing;
});
}
#endregion
#region Implementation
private static object CreateLogger<TElement>(ILoggerFactory factory)
{
return factory.CreateLogger<TElement>();
}
#endregion
}
}