Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Botframework 将LuisResult传递给子对话框_Botframework - Fatal编程技术网

Botframework 将LuisResult传递给子对话框

Botframework 将LuisResult传递给子对话框,botframework,Botframework,我有一个根对话框,一个LuisDialog,我从中调用一些子对话框,如下所示 [LuisModel("8869ccea-7c5f-4cce-8639-64bbc7ecd62b", "c5835534ed7746449356c62dcdf48fde")] [Serializable] public class DefaultDialog : LuisDialog<object> { [LuisIntent("showIncidents")] public as

我有一个根对话框,一个LuisDialog,我从中调用一些子对话框,如下所示

    [LuisModel("8869ccea-7c5f-4cce-8639-64bbc7ecd62b", "c5835534ed7746449356c62dcdf48fde")]
[Serializable]
public class DefaultDialog : LuisDialog<object>
{

    [LuisIntent("showIncidents")]
    public async Task ShowIncidents(IDialogContext context, IAwaitable<IMessageActivity> _message, LuisResult result)
    {
        var message = await _message;
        await context.Forward(new ShowIncident(), ResumeAfter,message,CancellationToken.None);
    }

    [LuisIntent("CreateIncident")]
    public async Task CreateIncident(IDialogContext context, LuisResult result)
    {
        //context.Call(new CreateIncident(), ResumeAfter);
        context.Call(new CreateIncident(), ResumeAfter);
    }
我尝试实现我的“ShowIncident”对话框,如下所示:

    [Serializable]
public class ShowIncident : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);
    }

    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<LuisResult> _result)
    {
        var result = await _result;
         // Get and post Incidents
         Incidents incidents = await ServiceNow.GetIncidentsAsync();
         await context.PostAsync(incidents.toText());
    }
}
[可序列化]
公开课展示事件:IDialog
{
公共异步任务StartAsync(IDialogContext上下文)
{
Wait(MessageReceivedAsync);
}
公共异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable\u结果)
{
var结果=等待结果;
//获取和发布事件
事件=等待ServiceNow.GetIncidentsAsync();
wait context.PostAsync(incents.toText());
}
}
这会引发一个错误,我认为这是因为
IAwaitable
必须是
IAwaitable

我意识到我可以使用几种变通方法,比如将实体作为消息放置,或者使用公共静态类来定义事件。但是“正确的方法”是什么呢?

将构造函数添加到
ShowIncident

public class ShowIncident : IDialog<object>
{
       private LuisResult _luisResult;
       public ShowIncident(LuisResult luisResult) 
       {
         _luisResult = _luisResult;
       }

       public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> activity)
       { //....
公共类ShowIncident:IDialog
{
私人LuisResult_LuisResult;
公众展示事件(LuisResult LuisResult)
{
_luisResult=_luisResult;
}
公共异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable活动)
{ //....

调用(new
CreateIncident(result),ResumeAfter)

将构造函数添加到
ShowIncident

public class ShowIncident : IDialog<object>
{
       private LuisResult _luisResult;
       public ShowIncident(LuisResult luisResult) 
       {
         _luisResult = _luisResult;
       }

       public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> activity)
       { //....
公共类ShowIncident:IDialog
{
私人LuisResult_LuisResult;
公众展示事件(LuisResult LuisResult)
{
_luisResult=_luisResult;
}
公共异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable活动)
{ //....

调用(new
CreateIncident(result),ResumeAfter)

接受的答案有问题,因为LuisResult不可序列化。这可能会导致对话框在运行时失败

有两个选项,您可以在构造函数中设置它,但是这会阻止您使用带有依赖项注入的对话框

另一个选项是在构建对话框后添加属性并设置LuisResult值,这与使用依赖项注入兼容

无论您选择怎样做,您都需要以下内容

[NonSerialized]
private LuisResult _luisData;
public LuisResult LuisData {
    get => _luisData;
    set => _luisData = value;
}

这是为了确保您不会创建运行时错误。

接受的答案有问题,因为LuisResult不可序列化。这可能会导致您的对话框在运行时失败

有两个选项,您可以在构造函数中设置它,但是这会阻止您使用带有依赖项注入的对话框

另一个选项是在构建对话框后添加属性并设置LuisResult值,这与使用依赖项注入兼容

无论您选择怎样做,您都需要以下内容

[NonSerialized]
private LuisResult _luisData;
public LuisResult LuisData {
    get => _luisData;
    set => _luisData = value;
}

这是为了确保您不会创建运行时错误。

David Manton关于LuisResult不可序列化的说法是正确的。您最好将需要的部分提取到您自己的可序列化对象中,并将其传递给对话框构造函数

然而,他对于依赖注入的回答是错误的。 在AutoFac模块中,或在执行注册的位置,您可以按如下方式注册对话框:

builder.Register((c, p) => new ShowIncident (p.Named<string("luisResult"))).InstancePerDependency();
            using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
            {
                context.Call(scope.Resolve<ShowIncident>(new NamedParameter("luisResult", luisResult)), ResumeAfterIncidentDialog);
            }

builder.Register((c,p)=>newshowIncident(p.NamedDavid Manton关于LuisResult不可序列化的说法是正确的。您最好将需要的部分提取到您自己的可序列化对象中,并将其传递给对话框构造函数

然而,他对于依赖注入的回答是错误的。 在AutoFac模块中,或在执行注册的位置,您可以按如下方式注册对话框:

builder.Register((c, p) => new ShowIncident (p.Named<string("luisResult"))).InstancePerDependency();
            using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
            {
                context.Call(scope.Resolve<ShowIncident>(new NamedParameter("luisResult", luisResult)), ResumeAfterIncidentDialog);
            }

builder.Register((c,p)=>newshowIncident(p.namedd)您的意思是“将构造函数添加到
ShowIncident
”吗@Sergey@superjos是的,谢谢你注意到了。我更正了答案。你的意思是“向ShowIncident添加构造函数吗?”相反@Sergey@superjos是的,谢谢你注意。我更正了答案。