如何使用 context.Forward 和 autofac
How to use context.Forward with autofac
我正在尝试使用 Microsoft Bot Framework 和 Autofac 构建一个机器人。
我有一个在 2 Dialogs 之间共享的服务,第一个 Dialog 根据用户响应实例化另一个。
在我的 Dialog 中,我调用了这一行:
await context.Forward(new StepDialog(_productProvider, _groups, _products, 0), ResumeAfter, new Activity { Text = category }, CancellationToken.None);
但我认为这是不对的。在我的控制器中,我这样做:
// Create our scope
using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, model))
{
// Create our conversation
await Conversation.SendAsync(model, () => scope.Resolve<IDialog<object>>());
};
所以我假设我必须做一些类似的事情来获取我的 StepDialog 的实例,同时保持对 ProductProvider 的引用(这是我的服务)。
我考虑过将作用域传递到初始 Dialog 的构造函数中,但我读到这是个坏主意,那么我该怎么做呢?
我看到一个工作得很好的想法是使用对话框工厂;所以你将它注入到你的对话框中并用它来解决其他对话框。
在 ContosoFlowers sample 中,您将找到对话框工厂的基本实现。下面是一些参考链接:
- 基地DialogFactory
- ContosoFlowersDialogFactory只是继承了基础DialogFactory,并为基础工厂未涵盖的情况添加了一个新方法。
- Here 是在 AutoFac 中注册工厂和对话框的方式
- Here 对话框工厂的使用方式
我正在尝试使用 Microsoft Bot Framework 和 Autofac 构建一个机器人。 我有一个在 2 Dialogs 之间共享的服务,第一个 Dialog 根据用户响应实例化另一个。 在我的 Dialog 中,我调用了这一行:
await context.Forward(new StepDialog(_productProvider, _groups, _products, 0), ResumeAfter, new Activity { Text = category }, CancellationToken.None);
但我认为这是不对的。在我的控制器中,我这样做:
// Create our scope
using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, model))
{
// Create our conversation
await Conversation.SendAsync(model, () => scope.Resolve<IDialog<object>>());
};
所以我假设我必须做一些类似的事情来获取我的 StepDialog 的实例,同时保持对 ProductProvider 的引用(这是我的服务)。
我考虑过将作用域传递到初始 Dialog 的构造函数中,但我读到这是个坏主意,那么我该怎么做呢?
我看到一个工作得很好的想法是使用对话框工厂;所以你将它注入到你的对话框中并用它来解决其他对话框。
在 ContosoFlowers sample 中,您将找到对话框工厂的基本实现。下面是一些参考链接:
- 基地DialogFactory
- ContosoFlowersDialogFactory只是继承了基础DialogFactory,并为基础工厂未涵盖的情况添加了一个新方法。
- Here 是在 AutoFac 中注册工厂和对话框的方式
- Here 对话框工厂的使用方式