BotBuilder-Samples'中的执行流程是什么? ' CreateNewConversationBot'

时间:2017-01-24 23:25:29

标签: botframework

我怀疑Ezequiel Jadib的一个!

我试图弄清楚上面的样本如何组合在一起,但它让我受到打击。

这是我对它的理解。我道歉 - 这里有很多。但我确定我并不是唯一一个想要了解BotFramework SDK处理传入消息的所有不同方式的人。

  1. 构建了根容器。添加DialogModule,以允许每个对话框实例的生命周期范围。每个对话框生命周期范围内相应地注册ResumptionCookie。然后添加SurveyModule,它将SurveyScheduler建立为单例,将CreateNewConversationDialog建立为依赖关系,并根据对话框建立SurveyService(DialogModule.LifetimeScopeTag。)SurveyService和SurveyScheduler都是神秘的.Keyed<ISurvey...>(FiberModule.Key_DoNotSerialize),我不确定,但认为与这些对象的某些引用成员不可序列化的事实有关吗?
  2. 所以,无论如何:每个CreateNewConversationDialog在实例化时都有自己的SurveyService。

    1. 我们的MessagesController是一切开始的地方。它需要一个ILifetimeScope参数,它(我最近学到的,谢谢:))由Autofac自动提供。问题:这个ILifetimeScope是根容器 - 即与SurveyTriggerer中引用的ILifetimeScope相同,GlobalConfiguration.Configuration.DependencyResolver?

    2. 在MessageController的Post方法中,IPostToBot在新的对话框生命周期范围内解析,并在那里发送传入消息。这会自动找到最后使用的对话框吗?第一次,它肯定会找到CreateNewConversationDialog,但这是怎么发生的? DialogModule.BeginLifetimeScope()的调用是否实际上隐式地将IDialog解析为CreateNewConversationDialog,如在SurveyModule中注册的那样? IPostToBot在哪里适合这个?我们之所以没有使用Conversation.SendAsync(),我们不知道我们目前是在SurveyDialog还是CreateNewConversationDialog?

    3. 假设我们在CreateNewConversationDialog中,它只是在收到的每条消息上循环,使用自己的恢复cookie调用自己的SurveyService的QueueSurveyAsync(),将cookie添加到单例“s”中并发队列。

    4. 问题:为什么要使用SurveyService?为什么不在CreateNewConversationDialog本身中引用SurveyScheduler及其自己的ResumptionCookie?

      1. SurveyScheduler单例的BackgroundWorkItem不断轮询其队列,并使用SurveyTriggerer的静态StartSurvey()方法在堆栈上弹出SurveyDialog,通过ResumptionCookie提取。 (这是相对可以理解的部分!)
      2. 无论如何,感谢阅读,我很感激任何澄清。

        注意:我发现所有频道都不支持此示例,因此我试图模仿一个新的直接对话&#39;只需在ContosoFlowers中从CheckoutController返回它的方法 - 而是使用Conversation.ResumeAsync()并让调用对话框自己调用子对话框。这是一个疯狂的想法吗?

1 个答案:

答案 0 :(得分:0)

想出了一些东西(虽然有些答案可能要长得多,因为有些话题太宽泛了。)

  1. FiberModule.Key_DoNotSerialize键主要用于指示BotBuilder在反序列化而不是序列化对象中从容器中恢复由对象类型键入的对象实例。 This thread可能有帮助。
  2. 他们不一样;控制器中的ILifetimeScope是一个 容器的子范围 GlobalConfiguration.Configuration.DependencyResolver。
  3. 简短回答:我们没有使用Conversation.SendAsync,因为这意味着手动创建对话框,我们希望使用DI,因为对话框具有需要解析的依赖项。 长答案IPostToBot是包含从用户向机器人发送消息的方法的接口。 BotBuilder库中有很多这种接口的实现,并且有一个chain of these registered in the AutoFac container。传入的消息流经链,直到最后一个(the PersistentDialogTask),它做了很多黑魔法:),就像使用ScoringEventLoop将传入的活动分配给可行的动作一样;如果可行动作不匹配,则会转到dialog system。您询问 :)。理解这一点的最好方法;是下载BotBuilder库的代码;将它挂钩到Bot并开始调试。
  4. 是的,可以根据您的建议进行简化。样本基于AlarmBot sample,所以我们在那里保留了很多作品。
  5. 是。并在机器人和用户之间创建直接对话。如果频道支持直接对话(例如Slack),如果您在多用户频道中与Bot通话,它将在私人对话中启动调查。
  6. 该示例的目的之一是展示如何根据永恒事件主动向用户发送消息。 Here是围绕主动消息的一些简单示例,我认为这些消息很有用。