Вызов методов от имени другого сотрудника
Вызов методов от имени другого сотрудника¶
Большинство средств API, таких как ICardRepository
(действия с карточками) и INotificationManager
(отправка писем уведомлений) используют объект сессии текущего сотрудника ISession
. Например, при отправке писем может использоваться плейсхолдер {userName}
для вывода имени текущего сотрудника.
Если требуется сформировать такое письмо для имени другого сотрудника, то на сервере (и в плагинах Chronos) можно “подменить” сотрудника в объекте сессии, используя конструкцию using(SessionContext.Create(...)) { ... }
, где любой запрос внутри фигурных скобок, использующий ISession
, получит текущего сотрудника с идентификатором и именем, указанным в вызове метода. Такой сотрудник может физически отсутствовать в справочнике сотрудников.
// объект ISession можно получить или из контекста расширения context, или из конструктора,
// если код выполняется в классе расширения, или из контейнера unityContainer,
// если выполнение производится в Chronos
var session = unityContainer.Resolve<ISession>();
// имя и идентификатор пользователя, которые будут возвращаться объектом текущей сессии ISession
// для всех вызовов внутри выражения using
Guid userID = new Guid("userID");
string userName = "User Name";
using (SessionContext.Create(session.CreateNestedSessionToken(userID, userName, seal: true))
{
// отправляем уведомление или выполняем любой другой запрос от имени пользователя userID / userName
await notificationManager.SendAsync(
"Notification_Name", cardID, new[] { new Guid("roleID"), }, excludeDeputies: true);
}
Если необходимо более гибко управлять свойствами такой сессии, например, указать параметр session.Token.HostName
с именем компьютера пользователя, то используйте конструктор класса SessionToken
. При этом необходимо указать корректный код сервера serverCode
, чтобы ссылки tessa://
также корректно генерировались.
// объект ITessaServerSettings можно получить из конструктора,
// если код выполняется в классе расширения, или из контейнера unityContainer,
// если выполнение производится в Chronos
var serverSettings = unityContainer.Resolve<ITessaServerSettings>();
string serverCode = serverSettings?.ServerCode ?? string.Empty;
// имя и идентификатор пользователя, которые будут возвращаться объектом текущей сессии ISession
// для всех вызовов внутри выражения using
Guid userID = new Guid("userID");
string userName = "User Name";
using (SessionContext.Create(new SessionToken(userID, userName, serverCode: serverCode,
hostName: "ComputerName", seal: true))
{
// отправляем уведомление или выполняем любой другой запрос от имени пользователя userID / userName
await notificationManager.SendAsync("Notification_Name", cardID, new[] { new Guid("roleID"), }, excludeDeputies: true);
}