2016-10-03 1 views
2

저는 Microsoft Bot Framework를 사용하여 Bot를 만듭니다. 나는이 같은 MessageController에 POST에 대화 상자를 호출하고 있습니다 :IDialog에서 ILifetimeScope 사용

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

내 대화 상자 클래스의 내부에서, 나는이 범위를 사용하는 공장을 사용해야합니다. 문제는이 범위를 Dialog 클래스 안에 넣는 것입니다.

ILifetimeScope를 생성자에 삽입하면 처음으로 작동합니다. 그러나이 유형은 직렬화 할 수 없습니다 (BotFramework에서 오류가 발생 함). 그래서 이것을 비 직렬화로 표시해야하지만이 범위를 다시 얻을 수있는 방법이 없습니다. 나는 기본 WebApi DependencyResolver를 사용하려고 시도하지만 키순 서비스를 해결하는 AutoFac 기능이 필요하다. DependencyResolver에서 ILifetimeScope를 해결하면 "루트"범위를 반환하고 중첩 된 범위 (메시지 컨트롤러에서 사용되는 것과 동일한)가 필요합니다.

가변적 인 범위에서 내 범위를 유지하면서 해결했지만 우아한 것은 아닙니다.

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

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

다른 아이디어가 있습니까?

답변

0

종속성을 해결하는 데 도움이되는 IComponentContext를 주입 할 수 있어야합니다.

클래스를 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에서 비 직렬화 서비스를 참조하는 다양한 방법에 대해 자세히 읽을 수 있습니다.

+0

고맙습니다 ... 나는이 사이트를 봇 샘플로 알지 못했습니다 ... –

+0

걱정할 필요가 없습니다. 그것은 아주 새로운 며칠 전 발표되었습니다 : https://blog.botframework.com/2016/09/26/new-bot-builder-sdk-samples-released/ –