Skip to content

Commit d7ffee6

Browse files
authored
Adding ILoggerFactory to the container, so it can be injected in a constructor parameter. (#3)
1 parent 0e180fb commit d7ffee6

File tree

4 files changed

+49
-15
lines changed

4 files changed

+49
-15
lines changed

Autofac.Extensions.DependencyInjection.AzureFunctions/ConfigurationExtensions.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,20 @@ public static IFunctionsHostBuilder UseAutofacServiceProviderFactory(this IFunct
2727
{
2828
var containerBuilder = new ContainerBuilder();
2929
containerBuilder.Populate(hostBuilder.Services);
30-
configurationAction?.Invoke(containerBuilder);
30+
containerBuilder.RegisterModule<LoggerModule>();
3131

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);
4134

4235
var container = containerBuilder.Build();
4336

4437
var scoped = new ScopedJobActivator(new AutofacServiceProvider(container));
38+
39+
// Replacing Azure Functions ServiceProvider
4540
hostBuilder.Services.Replace(ServiceDescriptor.Singleton(typeof(IJobActivator), scoped));
4641
hostBuilder.Services.Replace(ServiceDescriptor.Singleton(typeof(IJobActivatorEx), scoped));
4742

43+
// This will create a scoped execution when a function is triggered.
4844
hostBuilder.Services.AddScoped((provider) =>
4945
{
5046
var lifetimeScope = container.BeginLifetimeScope(Scopes.RootLifetimeScopeTag);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
}

Autofac.Extensions.DependencyInjection.AzureFunctions/ScopedJobActivator.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,16 @@ public T CreateInstance<T>(IFunctionInstanceEx functionInstance)
3131
// ILoggerFactory from Autofac container.
3232
// So we are retrieving it from InstanceServices.
3333
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+
);
3537

3638
// This will create the same ILogger of a regular ILogger not using DI.
3739
// This ILogger is scoped under the function trigger and will be disposed
3840
// right after the code execution.
41+
var functionName = functionInstance.FunctionDescriptor.ShortName;
3942
scope.Resolve<ILogger>(
40-
new NamedParameter(nameof(loggerFactory), loggerFactory),
41-
new NamedParameter(nameof(functionName), functionName)
43+
new NamedParameter(LoggerModule.functionNameParam, functionName)
4244
);
4345

4446
return CreateInstance<T>(scope);

SampleAutofacFunction/Services/Service2.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ class Service2 : IService2, IDisposable
77
{
88
private readonly Guid _id = Guid.NewGuid();
99
private readonly ILogger _logger;
10+
private readonly ILoggerFactory _loggerFactory;
1011

11-
public Service2(ILogger logger)
12+
public Service2(ILogger logger, ILoggerFactory loggerFactory)
1213
{
1314
_logger = logger;
14-
15+
_loggerFactory = loggerFactory;
1516
_logger.LogWarning($"Creating {this}");
1617
}
1718
public string Value { get; set; } = "Example injected service 2";

0 commit comments

Comments
 (0)