2017-05-06 5 views
3

Ich bemerkte, dass mit dem Bot-Framework und Telegram-Kanal die Smilies wie :) nicht in ein Emoji umgewandelt werden.Override Context.PostAsync im Bot-Framework

Trotzdem, es ist sehr einfach, wir müssen nur ändern :) zu: Lächeln: und ein nettes Emoji wird erscheinen.

Die optimale Lösung wäre, die context.PostAsync()-Funktion zu überschreiben, diese Art von String-Ersetzung durchzuführen und dann fortzufahren.

Können wir diese Methode überschreiben, ohne das gesamte Framework neu zu kompilieren?

Thanks :)

Antwort

4

Ich gehe davon aus, dass die für den Benutzer der Bot sendet, was Sie suchen ist, die Nachricht zu ändern.

Natürlich ist die grundlegende Option, nur die Logik hinzuzufügen, um nach dem Kanal in Ihrem Botdialog zu suchen, und das war es. Aber ich vermute, dass Sie diese Logik auf andere Dialoge wiederzuverwenden wollen, die auch nur eine statische Methode irgendwo könnte bedeuten, dass Sie tun können:

context.PostAsync(Utils.TransformMessage(message)); 

Nun, wenn Sie wirklich mit dem saubersten Ansatz gehen wollen, ich denken Sie, dass sollte Ihre eigene IMessageActivityMapper implementieren und registrieren Sie diese in den Autofac-Container, so dass die MapToChannelData_BotToUser Implementierung endet Aufruf es (siehe here).

Es gibt ein paar Implementierungen der IMessageActivityMapperhere und here können Sie betrachten; obwohl die Schnittstelle ist wirklich einfach und die ganze Idee ist, dass Sie die IMessageActivity erhalten, aktualisieren Sie eine der vorhandenen Eigenschaften (in Ihrem Fall wird es die Eigenschaft Text) und geben Sie die aktualisierte IMessageActivity zurück, damit es an den Benutzer geschrieben werden kann.

Sobald Sie Ihre Implementierung fertig haben, können Sie sie in Autofac in Ihrem Global.asax.cs registrieren.

protected void Application_Start(object sender, EventArgs e) 
{ 
    { 
     // http://docs.autofac.org/en/latest/integration/webapi.html#quick-start 
     var builder = new ContainerBuilder(); 

     // Register your mapper 
     builder 
     .RegisterType<MyActivityMapper>() 
     .AsImplementedInterfaces() 
     .SingleInstance(); 

     // Get your HttpConfiguration. 
     var config = GlobalConfiguration.Configuration; 

     // Register your Web API controllers. 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

     // Set the dependency resolver to be Autofac. 
     var container = builder.Build(); 
     config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 
    } 
}