注册没有特定构造函数签名的控制器时,已添加具有相同键的项
这真的很奇怪。 有一个使用Autofac 3.3的MVC 5应用程序,当我添加一个没有特定构造函数签名的新控制器时,抛出An item with the same key has already been added
的An 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}