我使用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);
}
还有其他想法吗?
答案 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中详细了解引用非序列化服务的不同方法。