public async Task<HttpResponseMessage> Post([FromBody] Activity incomingMessage) { try { if (incomingMessage.Type == ActivityTypes.Message) { using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container,activity)) { var stack = scope.Resolve<IDialogStack>(); } ...
这是在我的Global.asax中注册的模块:
private void RegisterBotModules() { var builder = new ContainerBuilder(); builder.RegisterModule(new DialogModule()); builder.RegisterModule(new ReflectionSurrogateModule()); builder.RegisterModule(new DialogModule_MakeRoot()); builder.RegisterModule<GlobalMessageHandler>(); builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly())); var store = new TableBotDataStore(/*connection string*/); builder.Register(c => store) .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore) .AsSelf() .SingleInstance(); builder.Register(c => new CachingBotDataStore(store,CachingBotDataStoreConsistencyPolicy.ETagBasedConsistency)) .As<IBotDataStore<BotData>>() .AsSelf() .InstancePerLifetimeScope(); builder.Update(Conversation.Container); var config = GlobalConfiguration.Configuration; config.DependencyResolver = new AutofacWebApiDependencyResolver(Conversation.Container); }
但是,我得到以下例外:
{“An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = IDialogTask (DelegateActivator),Services = [Microsoft.Bot.Builder.Dialogs.Internals.IDialogStack,Microsoft.Bot.Builder.Dialogs.Internals.IDialogTask],Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,Sharing = Shared,Ownership = OwnedByLifetimeScope —> Object reference not set to an instance of an object. (See inner exception for details.)”
内部异常:
“Object reference not set to an instance of an object.”
” at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable
1 parameters)\r\n at Autofac.Core.Resolving.InstanceLookup.<Execute>b__5_0()\r\n at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id,Func
1 creator)\r\n at Autofac.Core.Resolving.InstanceLookup.Execute()\r\n at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,IComponentRegistration registration,IEnumerable1 parameters)\r\n at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration,IEnumerable
1 parameters)\r\n at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration,IEnumerable1 parameters)\r\n at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context,Service service,IEnumerable
1 parameters,Object& instance)\r\n at Autofac.ResolutionExtensions.ResolveService(IComponentContext context,IEnumerable1 parameters)\r\n at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context,IEnumerable
1 parameters)\r\n at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context)\r\n at Progressive.CQBot.Controllers.MessagesController.d__0.MoveNext() in D:\Source\Repos\QUO_Cognitive_Quoting\Src\CQBot\Controllers\MessagesController.cs:line 33″
解决方法
请尝试以下方法:
using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container,activity)) { var botData = scope.Resolve<IBotData>(); await botData.LoadAsync(new System.Threading.CancellationToken()); var stack = scope.Resolve<IDialogStack>(); }