File tree Expand file tree Collapse file tree 4 files changed +49
-15
lines changed
Autofac.Extensions.DependencyInjection.AzureFunctions
SampleAutofacFunction/Services Expand file tree Collapse file tree 4 files changed +49
-15
lines changed Original file line number Diff line number Diff line change @@ -27,24 +27,20 @@ public static IFunctionsHostBuilder UseAutofacServiceProviderFactory(this IFunct
27
27
{
28
28
var containerBuilder = new ContainerBuilder ( ) ;
29
29
containerBuilder . Populate ( hostBuilder . Services ) ;
30
- configurationAction ? . Invoke ( containerBuilder ) ;
30
+ containerBuilder . RegisterModule < LoggerModule > ( ) ;
31
31
32
- containerBuilder
33
- . Register ( ( ctx , p ) =>
34
- {
35
- var factory = p . Named < ILoggerFactory > ( "loggerFactory" ) ?? ctx . Resolve < ILoggerFactory > ( ) ;
36
- var functionName = p . Named < string > ( "functionName" ) ?? "Unknown" ;
37
- return factory . CreateLogger ( Microsoft . Azure . WebJobs . Logging . LogCategories . CreateFunctionUserCategory ( functionName ) ) ;
38
- } )
39
- . AsSelf ( )
40
- . InstancePerTriggerRequest ( ) ;
32
+ // Call the user code to configure the container
33
+ configurationAction ? . Invoke ( containerBuilder ) ;
41
34
42
35
var container = containerBuilder . Build ( ) ;
43
36
44
37
var scoped = new ScopedJobActivator ( new AutofacServiceProvider ( container ) ) ;
38
+
39
+ // Replacing Azure Functions ServiceProvider
45
40
hostBuilder . Services . Replace ( ServiceDescriptor . Singleton ( typeof ( IJobActivator ) , scoped ) ) ;
46
41
hostBuilder . Services . Replace ( ServiceDescriptor . Singleton ( typeof ( IJobActivatorEx ) , scoped ) ) ;
47
42
43
+ // This will create a scoped execution when a function is triggered.
48
44
hostBuilder . Services . AddScoped ( ( provider ) =>
49
45
{
50
46
var lifetimeScope = container . BeginLifetimeScope ( Scopes . RootLifetimeScopeTag ) ;
Original file line number Diff line number Diff line change
1
+ using Microsoft . Extensions . Logging ;
2
+
3
+ namespace Autofac . Extensions . DependencyInjection . AzureFunctions
4
+ {
5
+ internal class LoggerModule : Module
6
+ {
7
+ public const string functionNameParam = "functionName" ;
8
+ public const string loggerFactoryParam = "loggerFactory" ;
9
+
10
+ protected override void Load ( ContainerBuilder builder )
11
+ {
12
+ builder
13
+ . Register ( ( ctx , p ) =>
14
+ {
15
+ var factory = ctx . Resolve < ILoggerFactory > ( ) ;
16
+ var functionName = p . Named < string > ( functionNameParam ) ;
17
+
18
+ return factory . CreateLogger ( Microsoft . Azure . WebJobs . Logging . LogCategories . CreateFunctionUserCategory ( functionName ) ) ;
19
+ } )
20
+ . AsSelf ( )
21
+ . InstancePerTriggerRequest ( ) ;
22
+
23
+ builder
24
+ . Register ( ( ctx , p ) =>
25
+ {
26
+ var factory = p . Named < ILoggerFactory > ( loggerFactoryParam ) ?? ctx . Resolve < ILoggerFactory > ( ) ;
27
+
28
+ return factory ;
29
+ } )
30
+ . AsSelf ( )
31
+ . SingleInstance ( ) ;
32
+
33
+ }
34
+ }
35
+ }
Original file line number Diff line number Diff line change @@ -31,14 +31,16 @@ public T CreateInstance<T>(IFunctionInstanceEx functionInstance)
31
31
// ILoggerFactory from Autofac container.
32
32
// So we are retrieving it from InstanceServices.
33
33
var loggerFactory = functionInstance . InstanceServices . GetService < ILoggerFactory > ( ) ?? scope . Resolve < ILoggerFactory > ( ) ;
34
- var functionName = functionInstance . FunctionDescriptor . ShortName ;
34
+ scope . Resolve < ILoggerFactory > (
35
+ new NamedParameter ( LoggerModule . loggerFactoryParam , loggerFactory )
36
+ ) ;
35
37
36
38
// This will create the same ILogger of a regular ILogger not using DI.
37
39
// This ILogger is scoped under the function trigger and will be disposed
38
40
// right after the code execution.
41
+ var functionName = functionInstance . FunctionDescriptor . ShortName ;
39
42
scope . Resolve < ILogger > (
40
- new NamedParameter ( nameof ( loggerFactory ) , loggerFactory ) ,
41
- new NamedParameter ( nameof ( functionName ) , functionName )
43
+ new NamedParameter ( LoggerModule . functionNameParam , functionName )
42
44
) ;
43
45
44
46
return CreateInstance < T > ( scope ) ;
Original file line number Diff line number Diff line change @@ -7,11 +7,12 @@ class Service2 : IService2, IDisposable
7
7
{
8
8
private readonly Guid _id = Guid . NewGuid ( ) ;
9
9
private readonly ILogger _logger ;
10
+ private readonly ILoggerFactory _loggerFactory ;
10
11
11
- public Service2 ( ILogger logger )
12
+ public Service2 ( ILogger logger , ILoggerFactory loggerFactory )
12
13
{
13
14
_logger = logger ;
14
-
15
+ _loggerFactory = loggerFactory ;
15
16
_logger . LogWarning ( $ "Creating { this } ") ;
16
17
}
17
18
public string Value { get ; set ; } = "Example injected service 2" ;
You can’t perform that action at this time.
0 commit comments