Visual Studio编码中Composer user.name/age的等效变量是什么
问题
在创建Azure机器人时,已知Bot Framework Composer中使用的turn.activity.text变量,等效于Visual Studio编码场景下的turnContext.Activity.Text。需确认:在Visual Studio中编写Bot代码时,Bot Framework Composer内的user.name、user.age属性对应的等效代码写法。
参考素材:
解答
Bot Framework Composer中的user.xxx属性属于用户级持久化状态,对应Bot Framework SDK原生的UserState存储模块,和临时的turn上下文属性不同,这类属性会和用户ID绑定长期存储,Visual Studio中的等效读写方式如下:
- 前置依赖:确保Bot项目已完成
UserState服务的依赖注入,Composer默认自动完成该配置,原生SDK开发需手动在Startup.cs中注册服务。 - 读写逻辑:需要先通过
UserState创建对应属性的访问器,再基于turnContext完成读写操作,参考代码:
public class CustomBot : ActivityHandler { private readonly UserState _userState; // 定义user.name、user.age对应的属性访问器 private readonly IStatePropertyAccessor<string> _userNameAccessor; private readonly IStatePropertyAccessor<int> _userAgeAccessor; public CustomBot(UserState userState) { _userState = userState; // 初始化访问器,属性名与Composer中定义的字段名保持一致即可实现数据互通 _userNameAccessor = _userState.CreateProperty<string>("name"); _userAgeAccessor = _userState.CreateProperty<int>("age"); } protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { // 读取属性:等效于Composer中引用${user.name}、${user.age} var userName = await _userNameAccessor.GetAsync(turnContext, () => string.Empty, cancellationToken); var userAge = await _userAgeAccessor.GetAsync(turnContext, () => 0, cancellationToken); // 写入/更新属性:等效于Composer中使用SetProperty动作给user.name、user.age赋值 await _userNameAccessor.SetAsync(turnContext, "张三", cancellationToken); await _userAgeAccessor.SetAsync(turnContext, 28, cancellationToken); // 必须调用保存方法,修改才会持久化,该步骤Composer默认自动执行 await _userState.SaveChangesAsync(turnContext, cancellationToken: cancellationToken); } }
注意:如果项目使用Dialog组件体系,也可以在对话步骤上下文(
WaterfallStepContext/DialogContext)中获取UserState实例,用相同逻辑读写属性,无需重复定义访问器。
如果是跨组件复用属性,直接通过turnContext.TurnState获取UserState实例后创建对应访问器即可,只要属性名一致,就能和Composer侧的user作用域数据完全打通。
内容的提问来源于stack exchange,提问作者Hoang Cao Bao
相关产品推荐
相关产品推荐

