Я реализовал внедрение зависимостей в своем приложении бота.
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, намерения будут выбраны правильно.Не уверен, что мне здесь не хватает.