2017-05-12 1 views
0

나는 재개 쿠키를 사용하여 적극적으로 봇을하고있다.싱글 톤 클래스의 봇 프레임 워크

개체 목록 인 1 개의 싱글 톤 클래스가 있습니다. 나는 싱글 같이 정의 여기서 나는 새로운 대화 매 x 초를 호출 타이머를 가지고있는 RootDialog에서

public class ConversationStarter 
    { 

     public static string resumptionCookie; 

     public static async Task Resume() 
     { 
      var message = ResumptionCookie.GZipDeserialize(resumptionCookie).GetMessage(); 
      var client = new ConnectorClient(new Uri(message.ServiceUrl)); 

      using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message)) 
      { 
       var botData = scope.Resolve<IBotData>(); 
       await botData.LoadAsync(CancellationToken.None); 
       var task = scope.Resolve<IDialogTask>(); 

       //interrupt the stack 
       var dialog = new AlarmDialog(); 
       task.Call(dialog.Void<object, IMessageActivity>(), null); 


       task.PollAsync(CancellationToken.None); 

       //flush dialog stack 
       await botData.FlushAsync(CancellationToken.None); 
      } 
     } 
    } 
} 

:

public static MyObj instance = new MyObj(); 

public List<Objects> thename = null; 
public int count { get; set; } 

public static MyObj Instance 
{ 
     get 
     { 
      return instance; 
     } 
} 

는 내가 conversationStarter 클래스가 있습니다. 이 대화 상자에서 내가 할 :

[Serializable] 
    public class NewDialog : IDialog<object> 
    { 
     public Myobj objList; 

     public async Task StartAsync(IDialogContext context) 
     { 
      objList= Myobj.Instance; 


      PromptDialog.Choice(context, this.AfterSelectOption, 
       new string[] { "Stay in this survey", "Get back to where I was" }, 
       "Hello, you're in the survey dialog. Please pick one of these options"); 

     } 

     private async Task AfterSelectOption(IDialogContext context, IAwaitable<string> result) 
     { 

      if ((await result) == "Get back to where I was") 
      { 
       await context.PostAsync("Great, back to the original conversation!"); 
       context.Done(String.Empty); //Finish this dialog 
      } 
      else 
      { 
       await context.PostAsync("I'm still on the survey until you tell me to stop"); 
       PromptDialog.Choice(context, this.AfterSelectOption, new string[] { "Stay in this survey", "Get back to where I was" }, "Hello, you're in the survey dialog. Please pick one of these options"); 

      } 
     } 
    } 
} 

나는 내가 다음과 같은 예외 INT의 ConversationStarter 점점 오전 NewDialog으로하여 MyObj의 인스턴스에 액세스하는 경우 :

task.PollAsync(CancellationToken.None); 
: 라인에서

Microsoft.Bot.Builder.Internals.Fibers.InvalidNeedException: 'invalid need: expected Wait, have None' 

내 싱글 톤 클래스에 액세스하려고하지 않으면 모든 것이 원활하게 진행됩니다. 이런 싱글 톤 클래스를 사용할 수 있습니까?

+0

싱글 톤 클래스를 직렬화 할 수 있습니까? –

+0

시리얼 화 가능 – JoaoFilipeClementeMartins

+0

이 샘플을 체크 아웃 한 적이 있습니까? https://github.com/MicrosoftDX/botFramework-proactiveMessages –

답변

0

이것은 사전 행동 봇을 구현하는 방법이 아닙니다. PollAsync 메서드를 호출하여 착각 한 것이 아니라면 재개 할 요점을주지 않고 대화 상자 스택을 중단하고 있습니다.

나는 this example을 봐야한다고 생각합니다. 그것은 당신의 봇과 같은 목표를 가지고 있지만 Autofac을 사용합니다. 보다 구체적으로는 ExternalEvents 클래스입니다. IOC 컨테이너를 사용하는 것은 Singleton을 구현하는 것보다 낫습니다.

관련 문제