настройка autofac в файле json внутри платформы бота - PullRequest
0 голосов
/ 05 июня 2018

Я использую файл autofac json, в котором перечислены все мои зависимости.Для справки ниже приведен файл json.

{
  "defaultAssembly": "DigitalAssistant.Wharf",
  "components": [
    {
      "type": "DigitalAssistant.Dialogs.RootDialog, DigitalAssistant.Wharf",
      "services": [
        {
          "type": "Microsoft.Bot.Builder.Dialogs.IDialog, Microsoft.Bot.Builder"
        }
      ],
      "injectProperties": true,
      "instanceScope": "perlifetimescope"
    }

  ]
}

Мой класс RootDialog выглядит следующим образом:

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

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var activity = await result as Activity;

        // Calculate something for us to return
        int length = (activity.Text ?? string.Empty).Length;

        // Return our reply to the user
        await context.PostAsync($"You sent {activity.Text} which was {length} characters");

        context.Wait(MessageReceivedAsync);
    }
}

и внутри MessageController.cs разрешаю зависимость следующим образом:

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        if (activity.GetActivityType() == ActivityTypes.Message)
        {
            using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
            {
                var dialog = scope.Resolve<IDialog<object>>();
                await Conversation.SendAsync(activity, () => dialog);
            }
        }
        else
        {
            HandleSystemMessage(activity);
        }
        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }

Проблема заключается в том, что при регистрации модуля с помощью приведенного ниже кода в Global.asax:

        var config = new ConfigurationBuilder();

        config.AddJsonFile("autofac.json");

        var module = new ConfigurationModule(config.Build());

        builder.RegisterModule(module);

он выдает ошибку как тип DigitalAssistant.Dialogs.RootDialog не назначается службе Microsoft.Bot.Builder.Dialogs.IDialog.

Что мне здесь не хватает, пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Попробуйте добавить дополнительный хендлинг при десериализации с помощью ключа-FiberModule.Key_DoNotSerialize, как это

       builder
            .RegisterType<DialogClass>()
            .Keyed<IDialogInterface>(FiberModule.Key_DoNotSerialize)
            .AsSelf()
            .As<IDialogInterface>()
            .SingleInstance();

Или, может быть, вы можете попробовать этот подход.

В GlobalAsax.cs

builder.RegisterModule(new TestModule());

In TestModule.cs

public sealed class TestModule : Module
    {
     protected override void Load(ContainerBuilder builder)
        {
            base.Load(builder);
            builder.RegisterType<DialogCreator>().As<IDialogCreator>();
            builder.RegisterType<RootDialog>().Keyed<IDialog<object>>("RootDialog");
        }
    }

In MessagesController.cs

public class MessagesController : ApiController
    {
        IDialogCreator DialogCreator;
        public MessagesController(IDialogCreator DialogCreator)
        {
            this.DialogCreator = DialogCreator;
        }
        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
        {
            try
            {
                HttpResponseMessage response;
                if (activity.Type == ActivityTypes.Message)
                {
                    var RootDialog = DialogCreator.GetDialog("RootDialog"); or // scope.ResolveNamed<IDialog<object>>("RootDialog");
                    await Conversation.SendAsync(activity, () => RootDialog);
                }
                else
                {
                    HandleSystemMessage(activity);
                }
        }
    }
0 голосов
/ 05 июня 2018

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

...