c# - 在 IDialog 中使用 ILifetimeScope

标签 c# autofac botframework

我正在使用 Microsoft Bot Framework 创建机器人。我正在将 POST 上的对话框调用到 MessageController,如下所示:

using (var scope = DialogModule.BeginLifetimeScope(_scope, activity))
{
  var postToBot = scope.Resolve<IPostToBot>();
  await postToBot.PostAsync(activity, cancellationToken);
}

在我的 Dialog 类中,我需要使用一个使用此范围的工厂。问题是在 Dialog 类中获取此范围。

如果我在构造函数上注入(inject) ILifetimeScope,它会第一次起作用。但这种类型不可序列化(在 BotFramework 上引发错误)。所以我必须将其标记为不可序列化,但我无法再次获得此范围。我尝试使用默认的 WebApi DependencyResolver,但我需要一个 AutoFac 功能来解析键控服务。如果我从 DependencyResolver 解析 ILifetimeScope,那么它返回“根”范围,我需要嵌套范围(与消息 Controller 上使用的相同)。

我解决了将范围保持在静态变量中的问题,但这并不优雅。

using (var scope = DialogModule.BeginLifetimeScope(_scope, activity))
{
  IocModule.CurrentScope = scope;

  var postToBot = scope.Resolve<IPostToBot>();
  await postToBot.PostAsync(activity, cancellationToken);
}

还有其他想法吗?

最佳答案

您应该能够注入(inject) IComponentContext,这将帮助您解决依赖关系。

查看 DialogFactory来自 ContosoFlowers 的类(class)样本。也看看 ContosoFlowersDialogFactory实现 DialogFactory 的类。在ContosoFlowersModule class 你会看到那个工厂的注册信息。

builder.RegisterType<ContosoFlowersDialogFactory>()
       .Keyed<IContosoFlowersDialogFactory>(FiberModule.Key_DoNotSerialize)
       .AsImplementedInterfaces()
       .InstancePerLifetimeScope();

构造函数需要 IComponentContext

public ContosoFlowersDialogFactory(IComponentContext scope)

关于在您的对话框中引用不可序列化服务,将它们标记为不可序列化并不是唯一的方法。您还可以使用 FiberModule.Key_DoNotSerialize解决依赖关系。您可以在此 Technical FAQ section 中阅读更多有关引用不可序列化服务的不同方法的信息。 .

关于c# - 在 IDialog 中使用 ILifetimeScope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39841983/

相关文章:

c# - 如何不丢失聊天机器人 v4 的对话流?

asp.net-core - 存储在 key 保管库中时未拾取 InstrumentationKey

c# - 格式化字符串/电话号码

c# - Autofac。检索所有注册为命名的服务

c# - 清楚地说明自动注册的程序集

c# - Autofac 解决 CQRS CommandDispatcher 中的依赖关系

c# - "Errors During Preprocessing"在 ASP.NET 性能计数器中非零

c# - 编写一个扫描电子商务网站并从中提取产品图片+价格+描述的C#程序

c# - 使用 C# 从 MS Word 中的加载项访问 RichTextContentControl 文本

botframework - V4 Botframework ActionTypes.PostBack 在聊天中显示所选选项