在IDialog中使用ILifetimeScope

时间:2016-10-03 23:31:00

标签: c# autofac botframework

我使用Microsoft Bot Framework创建了一个Bot。我在POST上调用MessageController对话框,如下所示:

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

在我的Dialog类中,我需要使用使用此范围的Factory。问题是将此范围放在Dialog类中。

如果我在构造函数上注入ILifetimeScope,它首次运行。但是这种类型不可序列化(在BotFramework上引发错误)。所以我必须将其标记为不可序列化,但我无法再次获得此范围。我尝试使用默认的WebApi DependencyResolver,但我需要一个解析密钥服务的AutoFac功能。如果我从DependencyResolver解析ILifetimeScope,那么它将返回&#34; root&#34;范围,我需要嵌套的范围(与消息控制器上使用的相同)。

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

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

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

还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

您应该能够注入IComponentContext,它将帮助您解决依赖关系。

查看DialogFactory示例中的ContosoFlowers课程。还要看一下实现DialogFactory的ContosoFlowersDialogFactory类。在ContosoFlowersModule课程中,您将看到该工厂的注册。

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

构造函数需要IComponentContext

public ContosoFlowersDialogFactory(IComponentContext scope)

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