2016-12-20 3 views
1

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

Может ли кто-нибудь посоветовать, почему эта переменная была бы нулевой и какие-либо потенциальные решения проблемы?

ответ

0

После очистки и восстановления снова мое решение сработало. Разочарование.