Autofac в BotFramework - прерывание потока LUIS? - PullRequest
0 голосов
/ 27 ноября 2018

Я реализовал внедрение зависимостей в своем приложении бота.

LuisDialog.cs

[LuisModel("xxx", "xxx")]
[Serializable]
public class LUISDialog : LuisDialog<object>
{
    private LuisDialog<object> _luisDialog;
    private ISalesDialog _salesDialog;

    public LUISDialog(LuisDialog<object> luisDialog, ISalesDialog salesDialog)
    {
        _luisDialog = luisDialog;
        _salesDialog = salesDialog;
    }
 }

LuisDialog.cs - намерение продажи

    [LuisIntent("Sales")]
    public async Task Sales(IDialogContext context, LuisResult result)
    {
        // Pass request to service for answer
        await context.PostAsync(_salesDialog.GetAnswer(result.Query));            
    }

MessagesController.cs

[BotAuthentication]
public class MessagesController : ApiController
{
    private LuisDialog<object> _luisDialog;
    private ISalesDialog _salesDialog;

    public MessagesController(LuisDialog<object> luisDialog, ISalesDialog salesDialog)
    {
        _luisDialog = luisDialog;
        _salesDialog = salesDialog;       
    }

    /// <summary>
    /// POST: api/Messages
    /// Receive a message from a user and reply to it
    /// </summary>
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {   
        var container = UWServiceInfrastructure.Infrastructure.EngineContext.Current.ContainerManager.Container;

        if (activity.Type == ActivityTypes.Message)
        {
            await Conversation.SendAsync(activity, () => new LUISDialog(_luisDialog, _salesDialog));
        }
        else
        {
            HandleSystemMessage(activity);
        }

        var response = Request.CreateResponse(HttpStatusCode.OK);

        return response;
    }

Моя проблема: Такое ощущение, что DI нарушает работу фреймворка бота.В частности, механизм, который находится в игре, который проверяет, к какому намерению нужно направить.

Мое приложение прекрасно загружается через эмулятор.Однако после ввода записи, специфичной для продаж, она попадает в конструктор в моем классе LUISDialog (как и ожидалось), попадает в файл WebAPIconfig.cs и завершается неудачно при вызове JsonConvert.DefaultSettings:

 public static void Register(HttpConfiguration config)
    {
        // Json settings
        config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;

        // DIES HERE - when hitting DefaultSettings
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Formatting = Newtonsoft.Json.Formatting.Indented,
            NullValueHandling = NullValueHandling.Ignore,
        };

        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Существуетнет сообщения об ошибке.Я только что получил код ответа 500.Когда я закомментирую часть внедрения в конструкторе LUISDialog, намерения будут выбраны правильно.Не уверен, что мне здесь не хватает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...