在Echo bot with state example Post([FromBody] Activity activity)
方法调用Func<IDialog<object>>
中键入delegate:
await Conversation.SendAsync(activity, () => new EchoDialog());
其中EchoDialog
有protected int count = 1;
成员,该成员计算对Task StartAsync()
的每次调用。只有new EchoDialog()
只执行一次才能纠正错误,因此lambda每次调用await Conversation.SendAsync()
时都会处理同一个对象。所以lambda只创建了一次并且对于每个Post([FromBody] Activity activity)
调用保持不变,对吧? lambda如何在这里工作?提前谢谢!
在Troelsen书中找不到正确的答案,:) Stackoverflow,MS docs等。
答案 0 :(得分:2)
每次执行委托时都会创建一个新的install
,这将是EchoDialog
的实现细节。基本上,您将方法定义传递给SendAsync
,它会调用该方法一次或多次。每次调用委托时,SendAsync
右侧的代码都将被执行。
如果您想确保为所有通话返回相同的 =>
实例,您可以这样做:
EchoDialog
这将每次返回var myDialog = new EchoDialog();
await Conversation.SendAsync(activity, () => myDialog);
实例,而不是每次都创建一个新实例。
根据the documentation of Conversation.SendAsyc
,委托(称为参数myDialog
)仅针对新会话进行调用,MakeRoot
对象被序列化并存储以供将来调用那次谈话。
仅为新会话调用MakeRoot工厂方法,因为现有会话具有IMessageActivity数据中序列化的对话框堆栈和状态。