Servicestack: есть ли какой-либо способ добавить пару ключ-значение из базы данных в событие OnConnect server

#servicestack

#servicestack

Вопрос:

У меня есть приведенное ниже событие OnConnect в файле запуска.

Мне нравится добавлять пары ключ-значение значение, которое я хочу получить из базы данных. Что-то вроде этого.

 OnConnect = (subscription, args) =>
                    {
                       var value = db.Select<Users>(v => v.Id == subscription.UserId).First();
agrs.Add("Key", value);
                    }
 

Комментарии:

1. Не могли бы вы прояснить вопрос о том, чего именно вы пытаетесь достичь и какова реальная проблема, которая мешает этому?

2. Итак, на стороне сервера у меня есть событие OnConnect в файле startup.cs, в аргументе args OnConnect я должен добавить новую пару ключ-значение, но ключ-значение, которое я хочу получить из базы данных, поскольку это словарь, в который мы можем напрямую добавлять ключ-значение пара, но как извлечь данные из базы данных в событии OnConnect. Также будет нормально, если мы сможем добавить новое свойство в аргумент подписки.

3. Я пытаюсь проработать конкретный вопрос, на который вы ищете ответ, вы просто хотите знать, как разрешить DB из IOC?

4. Да, и является ли хорошей практикой извлекать данные из базы данных в файле запуска? поскольку я обнаружил, что в аргументах уже есть ключ userId, а также поле userId в подписке, есть ли какой-нибудь лучший способ добавить еще одно поле из таблицы user либо в subscription, либо в args.

5. Если вашему приложению требуются данные из базы данных для его настройки, извлечение их из Startup или AppHost.Configure() — такое же подходящее место, как и любое другое, если это для пользователя, вы обычно заполняете его в сеансе пользователей при их аутентификации, что избавит вас от последующего обращения к базе данных. Примечание: вы можете использовать OnCreated обратный вызов для доступа к IRequest сеансу context access с аутентифицированными пользователями req.GetSession() .

Ответ №1:

За пределами ServiceStack вы можете разрешить свои зависимости IOC с помощью HostContext HostContext.AppHost одиночных элементов и, например:

 Plugins.Add(new ServerEventsFeature {
    OnConnect = (sub, connectArgs) => {
        using var db = HostContext.TryResolve<IDbConnectionFactory>().Open();
    }
});