2016-08-03 36 views
1

我试过这个解决方案:Custom fields with FormBuilder in the Microsoft Bot Framework与FormBuilder自定义字段在Microsoft博特框架 - 不工作

但未能获得它的工作....我遇到的问题是,当我分配base.Form =值_field中的_prompt获得一个默认识别器,并且它不会在下一行的SetRecognizer调用中被覆盖,只会替换_field的识别器。

但是,匹配过程在内部使用_prompt的识别器(?)。

这里是我的代码:

public class LuisIntentRecognizer<T> : RecognizePrimitive<T> 
where T : class 
{ 

public LuisIntentRecognizer(IField<T> field, string luisModelID, string luisSubscriptionKey) 
    : base(field) 
    { 
    _luisModelID = luisModelID; 
    _luisSubscriptionKey = luisSubscriptionKey; 
    } 

public override DescribeAttribute ValueDescription(object value) 
{ 
    return new DescribeAttribute((string)value); 
} 

public override IEnumerable<string> ValidInputs(object value) 
{ 
    yield return (string)value; 
} 

public override TermMatch Parse(string input) 
{ 
    TermMatch result = null; 
    if (!string.IsNullOrWhiteSpace(input)) 
    { 
     var luisModel = new LuisModelAttribute(_luisModelID, _luisSubscriptionKey); 
     var luisService = new LuisService(luisModel); 
     var luisResult = luisService.QueryAsync(input).Result; // TODO refactor somehow to async 

     var winner = luisResult.Intents.MaxBy(i => i.Score ?? 0d); 
     if (winner != null && !string.IsNullOrEmpty(winner.Intent)) 
     { 
      result = new TermMatch(0, winner.Intent.Length, 0.0, winner.Intent); 
     } 
     else 
     { 
      result = new TermMatch(0, input.Length, 0.0, input); 
     } 
    } 

    return result; 
} 

public override string Help(T state, object defaultValue) 
{ 
    var prompt = new Prompter<T>(_field.Template(TemplateUsage.StringHelp), _field.Form, null); 
    var args = HelpArgs(state, defaultValue); 
    return prompt.Prompt(state, _field.Name, args.ToArray()).Prompt; 
} 

private string _luisModelID; 
private string _luisSubscriptionKey; 
} 

public class LuisIntentField<T> : FieldReflector<T> 
    where T : class 
{ 
    public LuisIntentField(string name, string luisModelID, string luisSubscriptionKey, bool ignoreAnnotations = false) 
     : base(name, ignoreAnnotations) 
    { 
     _luisModelID = luisModelID; 
     _luisSubscriptionKey = luisSubscriptionKey; 
    } 

public override IForm<T> Form 
{ 
    set 
    { 
     base.Form = value; 
     base.SetRecognizer(new LuisIntentRecognizer<T>(this, _luisModelID, _luisSubscriptionKey));     
    } 
} 

private string _luisModelID; 
private string _luisSubscriptionKey; 
} 

任何人都可以得到它的工作? 谢谢

回答