2016-10-03 2 views
2

Я использую Microsoft Bot Framework для создания Bot. Я вызываю диалог на POST для MessageController, как это:Использование ILifetimeScope внутри IDialog

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

Внутри моего Диалог класса, мне нужно использовать завод, использующий эту область. Проблема заключается в получении этой области внутри класса Dialog.

Если я вставляю ILifetimeScope в конструктор, он работает в первый раз. Но этот тип не сериализуем (выдает ошибку в BotFramework). Поэтому я должен отметить это как несериализуемое, но у меня нет способов снова получить эту область. Я пытаюсь использовать по умолчанию WebApi DependencyResolver, но мне нужна функция AutoFac, которая разрешает ключевые службы. Если я разрешаю ILifetimeScope от DependencyResolver, тогда он возвращает область «root», и мне нужна вложенная область (такая же, что и на контроллере сообщений).

Я решил свою проблему, сохраняя область действия в переменной static, но это не изящно.

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

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

Другие идеи?

ответ

0

Вы должны уметь вводить IComponentContext, который поможет вам разрешить зависимости.

Посмотрите на класс DialogFactory из образца ContosoFlowers. Также взгляните на класс ContosoFlowersDialogFactory, который реализует DialogFactory. В классе ContosoFlowersModule вы увидите регистрацию этого завода.

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

Конструктор ожидает IComponentContext

public ContosoFlowersDialogFactory(IComponentContext scope) 

Что касается ссылок, не являющиеся serializables услуг в вашем диалоге, маркируя их как несериализуемая это не единственный способ. Вы также можете использовать FiberModule.Key_DoNotSerialize для разрешения зависимости. Вы можете узнать больше о различных способах ссылки на несериализуемые службы в этом Technical FAQ section.

+0

Большое спасибо ... Я не знал этот сайт с образцами бота ... –

+0

Не беспокойтесь. Это совершенно новое, и это было объявлено всего несколько дней назад: https://blog.botframework.com/2016/09/26/new-bot-builder-sdk-samples-released/ –

Смежные вопросы