如何在.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。
我是 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。