Как инициализировать глобальное состояние, например реестр сериализатора MongoDB, в функциях C# Azure?

Мы используем драйвер MongoDB для C#/.NET в функциях Azure. Чтобы использовать пользовательские сериализаторы, драйвер требует «регистрации» пользовательских сериализаторов в «Глобальном реестре», что, по-видимому, должно выполняться при запуске приложения и независимо от какой-либо конкретной функции.

С учетом этой и других междисциплинарных проблем существуют ли какие-либо методы, которые можно использовать в функциях Azure, которые поддерживаются или рекомендуются группой функций Azure? Я видел запросы в UserVoice на эти вещи и видел, что группа функций Azure начала пытаться добавить поддержку включения шаблонов DI/IOC для функций, но не знаю, каково текущее состояние.


person solvingJ    schedule 21.04.2017    source источник


Ответы (1)


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

Например, следующая функция

static DateTime Now() => DateTime.Now;
static DateTime now = Now();

public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info(now.ToString());
    return req.CreateResponse(HttpStatusCode.OK);
}

будет печатать ту же дату/время при последующих выполнениях, потому что now инициализируется только один раз.

person Mikhail Shilkov    schedule 21.04.2017
comment
Спасибо, но это не очень хорошее решение, потому что вам придется выбрать одну функцию, чтобы поместить ее. Тогда у вас не будет гарантии, что функция будет выполнена раньше всех других функций, которые могут на нее ссылаться. Стоит отметить, что такой шаблон можно использовать, просто поместив аналогичный код в общую сборку, что мы и делаем сегодня. Однако я надеюсь, что группа функций нашла (или недавно создала) более простой и естественный механизм/соглашение для включения кода запуска среды выполнения функций Azure. - person solvingJ; 21.04.2017
comment
Действительно, если у вас есть несколько функций, вы можете использовать общий код инициализации и вызывать его перед каждой функцией. - person Mikhail Shilkov; 21.04.2017
comment
Первоклассный механизм выполнения действий при запуске отслеживается этой проблемой github: github. .com/Azure/azure-webjobs-sdk-script/issues/281 - person Paul Batum; 22.04.2017