注册没有特定构造函数签名的控制器时,已添加具有相同键的项

这真的很奇怪。 有一个使用Autofac 3.3的MVC 5应用程序,当我添加一个没有特定构造函数签名的新控制器时,抛出An item with the same key has already been addedAn item with the same key has already been added错误。

我该如何调试呢?

如果构造函数如下所示,那么当我导航到该控制器的url时,它会加载正常:

 public class ProductController : Controller { private readonly IServiceManager _serviceManager; public ProductController(IServiceManager serviceManager) { _serviceManager = serviceManager; } } 

但是如果我添加一个没有构造函数,无参数构造函数或其他各种签名的新控制器并导航到它爆炸的特定URL:

 public class QuestionController : Controller { // explodes public QuestionController() { } // explodes public QuestionController(DbContext ctx) { } // loads fine public QuestionController(IServiceManager serviceManager) { } // loads fine public QuestionController(AnonymousIdentityHandler handler) { } } 

我在注册Autofac时这样做:

  builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); 

堆栈跟踪:

 [ArgumentException: An item with the same key has already been added.] System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) +52 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) +10933453 System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) +23 Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator) +161 Autofac.Core.Resolving.InstanceLookup.Execute() +132 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) +133 Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) +24 Autofac.Core.Registration.c__DisplayClass8.b__3(IComponentContext c, IEnumerable`1 p) +19 Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) +32 Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) +48 Autofac.Core.Resolving.InstanceLookup.Execute() +48 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) +133 Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) +24 Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) +74 Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) +53 Autofac.Core.Activators.Reflection.AutowiringPropertyInjector.InjectProperties(IComponentContext context, Object instance, Boolean overrideSetValues) +594 Autofac.Builder.c__DisplayClassd.b__c(Object s, ActivatingEventArgs`1 e) +32 Autofac.Core.Registration.ComponentRegistration.RaiseActivating(IComponentContext context, IEnumerable`1 parameters, Object& instance) +73 Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) +128 Autofac.Core.Resolving.InstanceLookup.Execute() +48 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) +133 Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) +24 Autofac.Core.Registration.c__DisplayClass8.b__3(IComponentContext c, IEnumerable`1 p) +19 Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) +32 Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) +48 Autofac.Core.Resolving.InstanceLookup.Execute() +48 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) +133 Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters) +44 

Autofac注册:

 builder.RegisterType().As().Named("WebApiContext").InstancePerHttpRequest(); builder.RegisterType().As().Named("MainContext").InstancePerHttpRequest(); builder.RegisterType().As().Named("OneTime").InstancePerDependency(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().AsSelf().PropertiesAutowired().InstancePerDependency(); builder.RegisterType().WithParameter(ResolvedParameter.ForNamed("WebApiContext")).InstancePerHttpRequest(); builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); // controllers builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); // allows injection into custom WebViewPage builder.RegisterSource(new ViewRegistrationSource()); // various builder.RegisterType().AsSelf().InstancePerHttpRequest(); builder.RegisterType().AsSelf().InstancePerHttpRequest(); builder.RegisterType().AsSelf().InstancePerHttpRequest().PropertiesAutowired(); // register all entity repositories builder.RegisterGeneric(typeof(EntityRepository)).As(typeof(IRepository)).InstancePerHttpRequest(); // services builder.RegisterAssemblyTypes(typeof(Product).Assembly) .Where(t => t.Name.EndsWith("Service")) .InstancePerHttpRequest().PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies); // paging stuff builder.RegisterType().As<IPagedProduct>().InstancePerDependency(); builder.RegisterType().As().InstancePerDependency(); builder.RegisterGeneric(typeof(PagedList)).InstancePerDependency(); // mvc action method injection. builder.RegisterType().As(); // http abstractions builder.RegisterModule(new AutofacWebTypesModule()); IContainer container = builder.Build(); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); return container; 

更新1

我能够进入Autofac代码并发现Autofac在GetOrCreateAndShare(Guid id, Func creator)调用期间尝试两次添加相同的密钥。 我不知道如何解决这个问题。 我只有一个电话来注册那种类型。 也许是autofac的线程错误?

 + this {Autofac.Core.Lifetime.LifetimeScope} Autofac.Core.Lifetime.LifetimeScope + id {3dc68c6e-60f2-4318-8975-6eb68ce82f3f} System.Guid + creator {Method = {System.Object b__0()}} System.Func + obj2 {SR.Data.Security.ApplicationUser} object {SR.Data.Security.ApplicationUser}