Как я могу использовать новый DI для добавления ILogger в функцию Azure с помощью IWebJobsStartup? - PullRequest
0 голосов
/ 26 февраля 2019

Я использую Azure Function v2.Вот моя функция, использующая внедрение конструктора:

public sealed class FindAccountFunction
{
    private readonly IAccountWorkflow m_accountWorkflow;

    private readonly IMapper m_mapper;

    private readonly ILogger m_logger;

    public FindAccountFunction(ILogger logger, IMapper mapper, IAccountWorkflow accountWorkflow)
    {
        m_logger = logger;
        m_mapper = mapper;
        m_accountWorkflow = accountWorkflow;
    }

    [FunctionName("FindAccount")]
    public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger logger)
    {
        // Do stuff.
    }
}

Я объявляю все зависимости, которые я хочу внедрить в мою функцию Azure, в классе автозагрузки, полученном из IWebJobsStartup:

    public sealed class Startup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder webJobsBuilder)
        {
            //  Registers the application settings' class.
            webJobsBuilder.Services.AddSingleton<IApplicationSettings, ApplicationSettings>();

            //  ** Registers the ILogger instance **
            //  ** ?? **

            //  Registers the IMapper instance for the contracts.
            var mapperConfiguration = new MapperConfiguration(cfg => cfg.AddProfile(new MyProfile()));

     webJobsBuilder.Services.AddSingleton(mapperConfiguration.CreateMapper());

            // Registers custom services.
            webJobsBuilder.Services.AddTransient<IStorageService, StorageService>();

            webJobsBuilder.Services.AddTransient<IAccountWorkflow, AccountWorkflow>();
        }
   }

Функция Azure вызывает другие внедренные службы, которые также зависят от ILogger, такие как IAccountWorkflow:

public sealed class AccountWorkflow : IAccountWorkflow
{  
    public AccountWorkflow(ILogger logger, IStorageService storageService)
    {
        if(logger is null)
            throw new ArgumentNullException();
    }
}

Проблема в том, что DI не может найти какой-либо ILoggerреализации и не удается разрешить службы, поскольку вводится значение ILogger.

Вопрос

Как настроить впрыск ILogger в IWebJobsStartup?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вы должны удалить вызов метода AddLogging из вашего класса запуска.Регистратор по умолчанию уже настроен узлом функции Azure.

[assembly: WebJobsStartup(typeof(StartUp))]
public class StartUp : IWebJobsStartup
{
    public void Configure(IWebJobsBuilder builder)
    {
        builder.Services.AddSingleton<AppSettings>();

        builder.Services.AddTransient<IMyService, MyService>();
    }
}

public MyFunction(IMyService service, ILogger<IMyService> logger)
{
    this.service = service;
    this.logger = logger;
}

Методы экземпляра теперь поддерживаются с функцией Azure, поскольку Время выполнения функций Azure 2.0.12265

enter image description here

0 голосов
/ 26 февраля 2019

ОБНОВЛЕНИЕ

Ссылка Использование внедрения зависимостей в .NET Azure Функции

Регистрация служб

Чтобы зарегистрировать службы, вы можете создатьнастроить метод и добавить компоненты к экземпляру IFunctionsHostBuilder.Хост функций Azure создает IFunctionsHostBuilder и передает его непосредственно в настроенный метод.

Чтобы зарегистрировать метод настройки, необходимо добавить атрибут сборки, который указывает тип для вашего метода настройки, используя атрибут FunctionsStartup.

Так что в этом случае

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]    
namespace MyNamespace {
    public class Startup : FunctionsStartup {
        public override void Configure(IFunctionsHostBuilder builder) {
            //  ** Registers the ILogger instance **
            builder.Services.AddLogging();

            //  Registers the application settings' class.
            //...

            //...omitted for brevity    
        }
    }
}

ORIGINAL

Я считаю, что, поскольку у вас есть доступ к коллекции служб, вы сможете добавить в нее протоколирование.

public void Configure(IWebJobsBuilder webJobsBuilder) {       

    //  ** Registers the ILogger instance **
    webJobsBuilder.Services.AddLogging();

    //OR
    //webJobsBuilder.Services.AddLogging(builder => {
    //    //...
    //});

    //  Registers the application settings' class.
    //...

    //...removed for brevity
}

и с ILoggerFactory в конструкторе функции.

//...

//Ctor
public FindAccountFunction(ILoggerFactory loggerFactory, IMapper mapper, IAccountWorkflow accountWorkflow) {
    m_logger = loggerFactory.CreateLogger<FindAccountFunction>();
    m_mapper = mapper;
    m_accountWorkflow = accountWorkflow;
}

//...
...