我怀疑Ezequiel Jadib的一个!
我试图弄清楚上面的样本如何组合在一起,但它让我受到打击。
这是我对它的理解。我道歉 - 这里有很多。但我确定我并不是唯一一个想要了解BotFramework SDK处理传入消息的所有不同方式的人。
.Keyed<ISurvey...>(FiberModule.Key_DoNotSerialize)
,我不确定,但认为与这些对象的某些引用成员不可序列化的事实有关吗?所以,无论如何:每个CreateNewConversationDialog在实例化时都有自己的SurveyService。
我们的MessagesController是一切开始的地方。它需要一个ILifetimeScope参数,它(我最近学到的,谢谢:))由Autofac自动提供。问题:这个ILifetimeScope是根容器 - 即与SurveyTriggerer中引用的ILifetimeScope相同,GlobalConfiguration.Configuration.DependencyResolver?
在MessageController的Post方法中,IPostToBot在新的对话框生命周期范围内解析,并在那里发送传入消息。这会自动找到最后使用的对话框吗?第一次,它肯定会找到CreateNewConversationDialog,但这是怎么发生的? DialogModule.BeginLifetimeScope()的调用是否实际上隐式地将IDialog解析为CreateNewConversationDialog,如在SurveyModule中注册的那样? IPostToBot在哪里适合这个?我们之所以没有使用Conversation.SendAsync(),我们不知道我们目前是在SurveyDialog还是CreateNewConversationDialog?
假设我们在CreateNewConversationDialog中,它只是在收到的每条消息上循环,使用自己的恢复cookie调用自己的SurveyService的QueueSurveyAsync(),将cookie添加到单例“s”中并发队列。
问题:为什么要使用SurveyService?为什么不在CreateNewConversationDialog本身中引用SurveyScheduler及其自己的ResumptionCookie?
无论如何,感谢阅读,我很感激任何澄清。
注意:我发现所有频道都不支持此示例,因此我试图模仿一个新的直接对话&#39;只需在ContosoFlowers中从CheckoutController返回它的方法 - 而是使用Conversation.ResumeAsync()并让调用对话框自己调用子对话框。这是一个疯狂的想法吗?
答案 0 :(得分:0)
想出了一些东西(虽然有些答案可能要长得多,因为有些话题太宽泛了。)
FiberModule.Key_DoNotSerialize
键主要用于指示BotBuilder在反序列化而不是序列化对象中从容器中恢复由对象类型键入的对象实例。 This thread可能有帮助。该示例的目的之一是展示如何根据永恒事件主动向用户发送消息。 Here是围绕主动消息的一些简单示例,我认为这些消息很有用。