Я пытаюсь использовать Autofac для предоставления услуги классу диалога в моем бот-чате через инъекцию зависимости. Я настроил контейнер Autofac, как показано ниже в моем файле Global.asax.cs:#botframework dependency injection
var builder = new ContainerBuilder();
var config = GlobalConfiguration.Configuration;
builder
.RegisterType<RootDialog>()
.As<IDialog<object>>()
.InstancePerDependency();
builder
.RegisterType<GoogleAnalyticsService>()
.Keyed<IAnalyticsService>(FiberModule.Key_DoNotSerialize)
.AsImplementedInterfaces()
.SingleInstance();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterWebApiFilterProvider(config);
builder.Update(Conversation.Container);
Этот код в моем классе MessageController успешно решает диалог:
using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
{
await Conversation.SendAsync(activity,() => scope.Resolve<IDialog<object>>());
}
Когда диалог первый разрешенный и тому запускается конструктор, реализация IAnalyticsService успешно внедряется, как это наблюдается при отладке в Visual Studio.
[Serializable]
public class RootDialog : IDialog<object>
{
private readonly IAnalyticsService _analyticsService;
public RootDialog(IAnalyticsService analyticsService)
{
SetField.NotNull(out _analyticsService, nameof(analyticsService), analyticsService);
}
}
Однако при попытке доступа к переменной _analyticsService после этой стадии (т.е. при обработке сообщения, отправленного пользователем) это всегда нуль. Я попытался установить для него атрибут NonSerializable, но это не имело никакого значения. Дальнейшая отладка также показала, что конструктор больше не попадает.
Может ли кто-нибудь посоветовать, почему эта переменная была бы нулевой и какие-либо потенциальные решения проблемы?