使用Autofac在组件类Azure Functions中注入ILogger实例

时间:2018-08-28 07:06:34

标签: c# autofac azure-functions autofac-configuration

我正在编写一个简单的Azure函数。

我已经安装了AzureFunctions.Autofac nuget软件包,并希望将其用作我的DI库。

我已经建立了以下AutofacConfig类来注册我的类型:

public class AutofacConfig
{
    public AutofacConfig(string functionName)
    {
        DependencyInjection.Initialize(builder =>
        {
            //do all of you initialization here

            //db client
            builder.RegisterType<EventComponent>()
            .As<IComponent<EventModel>>().SingleInstance(); 
        }, functionName);
    }
}

这是我的EventComponent类,我想向其注入提供的ILogger实例。

public class EventComponent : IComponent<EventModel>
{
    private ILogger _log;

    public EventComponent(ILogger logger)
    {
        _log = logger;
    }
}

这是我注入EventComponent的方式:

[FunctionName("AddEvent")]
    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, ILogger log, [Inject]IComponent<EventModel> component)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        await component.Add(new EventModel() { Id = Guid.NewGuid(), Description = $"Test description nr: {new Random().Next(1, 100000)}", User = "Test User" });

        return req.CreateResponse(HttpStatusCode.OK);
    }

问题是,由于Autofac无法解析参数Microsoft.Extensions.Logging.ILogger,因此我在上面遇到了一个例外。

以下是异常消息:

  

异常绑定参数'component'...无法解析构造函数'Void .ctor(Microsoft.Extensions.Logging.ILogger)'的参数'Microsoft.Extensions.Logging.ILogger logger'。 (有关详细信息,请参阅内部异常。)->使用可用服务和参数调用类型'Event.Function.Components.EventComponent'的'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'找不到的构造函数:\ r \ n无法解析构造函数'Void .ctor(Microsoft.Extensions.Logging.ILogger)'的参数'Microsoft.Extensions.Logging.ILogger logger'。”,

如何将ILogger实例注入我的EventComponent类中?

2 个答案:

答案 0 :(得分:2)

在Azure Functions V2中,默认情况下将注入ILogger。此外,这是关于Azure Functions中的依赖项注入的两篇非常不错的文章。 https://blog.mexia.com.au/dependency-injections-on-azure-functions-v2

http://codingsoul.de/2018/01/19/azure-function-dependency-injection-with-autofac/

答案 1 :(得分:0)

我在寻找同一件东西时发现了您的问题。找到解决方案了吗?

因为我认为这是不可能的。 ILogger日志是由框架注入的,我看不到如何从您的AutofacConfig类中引用它。

我解决此问题的方法是将EventComponent-class更改为使用Setter-injection而不是Constructor-injection,如下所示:

public class EventComponent : IComponent<EventModel>
{
    public ILogger Log { get; set; }    
}

并更改您的功能以设置对数属性:

[FunctionName("AddEvent")]
    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, ILogger log, [Inject]IComponent<EventModel> component)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
        component.Log = log;
        await component.Add(new EventModel() { Id = Guid.NewGuid(), Description = $"Test description nr: {new Random().Next(1, 100000)}", User = "Test User" });

        return req.CreateResponse(HttpStatusCode.OK);
    }

缺点是,您需要记住在使用该类的每个函数的开始处设置该值,但是注入有效。