如何在.NET Framework下通过autofac将'TeamSpecificConversationState'、'DropNonTeamsActivitiesMiddleware'和'TeamsMiddleware'注入Bot

How to inject 'TeamSpecificConversationState', 'DropNonTeamsActivitiesMiddleware' and 'TeamsMiddleware' into Bot by autofac under .NET Framework

我是 MS Bot 开发的新手。我尝试在 .NET Framework 下通过 Web API 和 autofac 开发一个 MS Teams 机器人。作为 MS 示例代码,该机器人可以像普通机器人一样工作。现在我只想在 Teams activity 和对话中使用它,而不是在人际关系中使用它。作为 Preview Release of .Net Teams Bot Builder v4 SDK,TeamSpecificConversationState、DropNonTeamsActivitiesMiddleware、DropChatActivitiesMiddleware 和 TeamsMiddleware 可以在我的开发案例中使用。但是我不能很好地使用 autofac 和 Bot Frameworkv4。下面是我的代码:

    //setting Bot data store policy to use last write win
    //example if bot service got restarted, existing conversation would just overwrite data to store
    public static class BotConfig
    {
        public static void Register(HttpConfiguration config)
        {
            var builder = new ContainerBuilder();
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

            // The ConfigurationCredentialProvider will retrieve the MicrosoftAppId and
            // MicrosoftAppPassword from Web.config
            builder.RegisterType<ConfigurationCredentialProvider>().As<ICredentialProvider>().SingleInstance();

            // Create the Bot Framework Adapter with error handling enabled.
            builder.RegisterType<AdapterWithErrorHandler>().As<IBotFrameworkHttpAdapter>().SingleInstance();


            // The Memory Storage used here is for local bot debugging only. When the bot
            // is restarted, everything stored in memory will be gone.
            IStorage dataStore = new MemoryStorage();

            //// Create Conversation State object.
            //// The Conversation State object is where we persist anything at the conversation-scope.
            //TeamSpecificConversationState conversationState = new TeamSpecificConversationState(dataStore);
            //builder.RegisterInstance(conversationState).As<TeamSpecificConversationState>().SingleInstance();
            var conversationState = new ConversationState(dataStore);

            //// Drop all activites not received from Microsoft Teams channel.
            //builder.RegisterType<DropNonTeamsActivitiesMiddleware>().As<IMiddleware>().SingleInstance();

            //// For TeamContext object, Add Teams Middleware
            //builder.Register(c => new TeamsMiddleware(
            //   new ConfigurationCredentialProvider())).As<IMiddleware>().SingleInstance();

            //// Automatically drop all non Team messages.
            //builder.RegisterType<DropChatActivitiesMiddleware>().As<IMiddleware>().SingleInstance();

            builder.RegisterInstance(conversationState).As<ConversationState>().SingleInstance();


            // Register the NextLabsBot as the IBot interface
            builder.RegisterType<myBot>().As<IBot>();

            var container = builder.Build();
            var resolver = new AutofacWebApiDependencyResolver(container);
            config.DependencyResolver = resolver;
        }
    }

未注释的代码可以作为普通bot使用,来自MS

'//'注释的代码是我的尝试,但它不起作用。

'////'注释的代码是SDK的用法和我的一些想法。

可以做些什么来完成它。谢谢!

不要通过 AddBot 注册 bot 和注入中间件。 您应该注入您自己的 IBot(您已经在这样做)并通过适配器添加中间件。

这里是correct example.

它是 dotnet 核心,但只要您使用的是 V4 SDK,模式就应该相同。官方的例子github好像过时了

有关详细信息,请参阅我的 discussion with them on github