You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 04:45:48