如何在 Microsoft Bot Framework 中组织多个 ActivityHandler 类

How to organise multiple ActivityHandler classes in Microsoft Bot Framework

我正在使用 MS Bot Framework 开发我的第一个机器人,虽然我了解基础知识,但我对如何组织我的代码有点无能为力。例如。我打算

我在 Visual Studio 中使用核心模板,它带有一个 Bots 文件夹,其中 class 以 Bot 结尾。查看一些示例,在我看来,机器人处理逻辑需要放在这里。所以,我决定有 3 个 classes,全部从 ActivityHandler 扩展而来,每个都执行上述任务之一。假设我有 3 classes,

public class MyNotifierBot: ActivityHandler
{
    // Constructor and overrides
}

public class WelcomeBot: ActivityHandler
{
    // Constructor and overrides
}

public class ResponseBot: ActivityHandler
{
    // Constructor and overrides
}

第一个问题是,如果我将所有 3 个 classes 注册为 services.AddTransient<IBot, MyNotifierBot>() 等,我只能在我的控制器中获得最后注册的机器人。当然,我可以在控制器中获取一组实现,并使用反射找出正确的实现,只是感觉不对。

我的问题是,如果这个模式是错误的,我应该有一个从 ActivityHandler 扩展的 class 并将我的逻辑写在单独的服务中。或者有没有更好的方法。

编辑:考虑到这一点后,我现在想知道 Bots 文件夹是否存在。如果我不打算创建多个 ActivityHandler subclasses 来做不同的事情,那么这个结构到底是做什么用的?

ActivityHandler 实现了 IBot,所以它可以被认为是一个机器人。拥有多个 activity 处理程序就像拥有多个机器人一样。 Activity 处理程序已经设计为将不同的 activity 类型路由到不同的代码,因此如果路由是您关心的问题,那么您只需要一个 activity 处理程序。

我认为您的通知程序是针对 proactive messaging. Rather than having a separate activity handler for it, what normally works is to have a separate endpoint, which is usually api/notify(而不是 api/messages)的。如果需要,您仍然可以为此使用一个单独的 activity 处理程序,或者甚至不使用 activity 处理程序(如示例中所示)。请注意,不同的渠道可能对主动消息有特殊的考虑,但这不在您的问题范围内。

Welcome messages are very easy with activity handlers. You can just use OnMembersAddedAsync in your one activity handler, and there's no need for a whole separate activity handler. Welcome messages are also channel-specific because they rely on conversation update activities, and not every channel has a well-defined way to know when a conversation starts before the user says anything. Here's a sample 如果您正在使用网络聊天。

如果您希望在依赖注入中实现同一接口的多个实现,那么您需要通过实现而不是接口来识别它们,但请记住,您不需要将它们放入依赖注入中完全没有。