Вставить экземпляр ILogger в мой класс компонентов Azure Functions, используя Autofac - PullRequest
0 голосов
/ 28 августа 2018

Я пишу простую функцию 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.

Вот сообщение об исключении:

Параметр привязки исключения «компонент» ... Не удается разрешить параметр «Microsoft.Extensions.Logging.ILogger logger» конструктора «Void .ctor (Microsoft.Extensions.Logging.ILogger)». (Подробности см. Во внутреннем исключении.) -> Ни один из конструкторов, найденных с 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' для типа 'Event.Function.Components.EventComponent', не может быть вызван с доступными службами и параметрами: \ r \ nНе удается разрешить параметр «Microsoft.Extensions.Logging.ILogger logger» конструктора «Void .ctor (Microsoft.Extensions.Logging.ILogger)». ",

Как я могу добавить экземпляр ILogger в мой EventComponent класс?

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Я нашел ваш вопрос, когда искал то же самое. Вы нашли решение?

Потому что я не думаю, что это возможно. Журнал ILogger внедряется платформой, и я не понимаю, как на него можно ссылаться из вашего класса AutofacConfig.

Как я решил эту проблему, изменив класс EventComponent для использования Setter-инъекций вместо Constructor-инъекций, например:

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

и измените свою функцию для установки свойства Log:

[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);
    }

Недостатком является то, что вам нужно помнить об установке этого значения в начале каждой функции, которая использует этот класс, но внедрение работает.

0 голосов
/ 28 августа 2018

В функциях Azure V2 ILogger вводится по умолчанию. Кроме того, вот две очень хорошие статьи о внедрении зависимостей в функциях Azure. https://blog.mexia.com.au/dependency-injections-on-azure-functions-v2

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

...