2016-12-20 228 views
1

我正在嘗試使用Autofac通過依賴注入爲聊天機器人中的對話框類提供服務。我在的Global.asax.cs文件,如下配置的Autofac容器:#botframework依賴注入

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

清洗並重新構建後,我的解決方案工作。令人沮喪。