#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();
}
});