为 ASP.NET Web API 安装了 Unity 引导程序 - 尝试创建 'AccountController' 类型的控制器时发生错误
Installed Unity bootstrapper for ASP.NET Web API - An error occurred when trying to create a controller of type 'AccountController'
我以前使用教程 Dependency Injection in ASP.NET Web API 2 中的 Unity 依赖注入。
但是我想使用 HierarchicalLifetimeManager
所以我安装了 Unity bootstrapper for ASP.NET Web API.
然而,这给了我一个错误,我以前在 AccountController
中没有。据我所知,它与 IUserStore 有关,但我不明白为什么在安装此 NuGet 后会出现此错误。之前已经安装和使用过 Unity,我不必为 AccountController
.
注册类型
UnityConfig.cs:
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<DbContext>(new HierarchicalLifetimeManager());
container.RegisterType<IArticleRepository, ArticleRepository>(new HierarchicalLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>(new HierarchicalLifetimeManager());
container.RegisterType<IContactRepository, ContactRepository>(new HierarchicalLifetimeManager());
container.RegisterType<ICampaignRepository, CampaignRepository>(new HierarchicalLifetimeManager());
}
{"Message":"An error has occurred.","ExceptionMessage":"An error
occurred when trying to create a controller of type
'AccountController'. Make sure that the controller has a parameterless
public
constructor.","ExceptionType":"System.InvalidOperationException","StackTrace":"
at
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage
request, HttpControllerDescriptor controllerDescriptor, Type
controllerType)\r\n at
System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage
request)\r\n at
System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()","InnerException":{"Message":"An
error has occurred.","ExceptionMessage":"Resolution of the dependency
failed, type = \"Project.Sales.Web.Controllers.AccountController\",
name = \"(none)\".\r\nException occurred while: while
resolving.\r\nException is: InvalidOperationException - The current
type,
Microsoft.AspNet.Identity.IUserStore`2[HiQ.Repository.EntityFramework.Identity.BaseApplicationUser,System.Int32],
is an interface and cannot be constructed. Are you missing a type
mapping?\r\n-----------------------------------------------\r\nAt the
time of the exception, the container was:\r\n\r\n Resolving
Project.Sales.Web.Controllers.AccountController,(none)\r\n Resolving
parameter \"userManager\" of constructor
Project.Sales.Web.Controllers.AccountController(Project.Sales.Web.ApplicationUserManager
userManager,
Microsoft.Owin.Security.ISecureDataFormat`1[[Microsoft.Owin.Security.AuthenticationTicket,
Microsoft.Owin.Security, Version=3.0.1.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35]] accessTokenFormat)\r\n Resolving
Project.Sales.Web.ApplicationUserManager,(none)\r\n Resolving
parameter \"store\" of constructor
Project.Sales.Web.ApplicationUserManager(Microsoft.AspNet.Identity.IUserStore`2[[HiQ.Repository.EntityFramework.Identity.BaseApplicationUser,
HiQ.Repository.EntityFramework, Version=0.1.2.0, Culture=neutral,
PublicKeyToken=null],[System.Int32, mscorlib, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089]] store)\r\n
Resolving
Microsoft.AspNet.Identity.IUserStore`2[HiQ.Repository.EntityFramework.Identity.BaseApplicationUser,System.Int32],(none)\r\n","ExceptionType":"Microsoft.Practices.Unity.ResolutionFailedException","StackTrace":"
at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object
existing, String name, IEnumerable`1 resolverOverrides)\r\n at
Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name,
ResolverOverride[] resolverOverrides)\r\n at
Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer
container, Type t, ResolverOverride[] overrides)\r\n at
Microsoft.Practices.Unity.WebApi.UnityDependencyResolver.SharedDependencyScope.GetService(Type
serviceType)\r\n at
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage
request, Type controllerType, Func`1& activator)\r\n at
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage
request, HttpControllerDescriptor controllerDescriptor, Type
controllerType)","InnerException":{"Message":"An error has
occurred.","ExceptionMessage":"The current type,
Microsoft.AspNet.Identity.IUserStore`2[HiQ.Repository.EntityFramework.Identity.BaseApplicationUser,System.Int32],
is an interface and cannot be constructed. Are you missing a type
mapping?","ExceptionType":"System.InvalidOperationException","StackTrace":"
at
Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext
context)\r\n at lambda_method(Closure , IBuilderContext )\r\n at
Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.b__0(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey
newBuildKey)\r\n at
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext
context)\r\n at lambda_method(Closure , IBuilderContext )\r\n at
Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.b__0(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey
newBuildKey)\r\n at
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext
context)\r\n at lambda_method(Closure , IBuilderContext )\r\n at
Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.b__0(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext
context)\r\n at
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext
context)\r\n at
Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object
existing, String name, IEnumerable`1 resolverOverrides)"}}}
最初的问题是 Unity 试图用两个参数调用构造函数:
public AccountController(ApplicationUserManager userManager,
ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
UserManager = userManager;
AccessTokenFormat = accessTokenFormat;
}
通过添加以下行,告诉 Unity 调用无参数构造函数,一切又恢复正常了。
container.RegisterType<AccountController>(new InjectionConstructor());
我以前使用教程 Dependency Injection in ASP.NET Web API 2 中的 Unity 依赖注入。
但是我想使用 HierarchicalLifetimeManager
所以我安装了 Unity bootstrapper for ASP.NET Web API.
然而,这给了我一个错误,我以前在 AccountController
中没有。据我所知,它与 IUserStore 有关,但我不明白为什么在安装此 NuGet 后会出现此错误。之前已经安装和使用过 Unity,我不必为 AccountController
.
UnityConfig.cs:
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<DbContext>(new HierarchicalLifetimeManager());
container.RegisterType<IArticleRepository, ArticleRepository>(new HierarchicalLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>(new HierarchicalLifetimeManager());
container.RegisterType<IContactRepository, ContactRepository>(new HierarchicalLifetimeManager());
container.RegisterType<ICampaignRepository, CampaignRepository>(new HierarchicalLifetimeManager());
}
{"Message":"An error has occurred.","ExceptionMessage":"An error occurred when trying to create a controller of type 'AccountController'. Make sure that the controller has a parameterless public constructor.","ExceptionType":"System.InvalidOperationException","StackTrace":" at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"Resolution of the dependency failed, type = \"Project.Sales.Web.Controllers.AccountController\", name = \"(none)\".\r\nException occurred while: while resolving.\r\nException is: InvalidOperationException - The current type, Microsoft.AspNet.Identity.IUserStore`2[HiQ.Repository.EntityFramework.Identity.BaseApplicationUser,System.Int32], is an interface and cannot be constructed. Are you missing a type mapping?\r\n-----------------------------------------------\r\nAt the time of the exception, the container was:\r\n\r\n Resolving Project.Sales.Web.Controllers.AccountController,(none)\r\n Resolving parameter \"userManager\" of constructor Project.Sales.Web.Controllers.AccountController(Project.Sales.Web.ApplicationUserManager userManager, Microsoft.Owin.Security.ISecureDataFormat`1[[Microsoft.Owin.Security.AuthenticationTicket, Microsoft.Owin.Security, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] accessTokenFormat)\r\n Resolving Project.Sales.Web.ApplicationUserManager,(none)\r\n Resolving parameter \"store\" of constructor Project.Sales.Web.ApplicationUserManager(Microsoft.AspNet.Identity.IUserStore`2[[HiQ.Repository.EntityFramework.Identity.BaseApplicationUser, HiQ.Repository.EntityFramework, Version=0.1.2.0, Culture=neutral, PublicKeyToken=null],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] store)\r\n Resolving Microsoft.AspNet.Identity.IUserStore`2[HiQ.Repository.EntityFramework.Identity.BaseApplicationUser,System.Int32],(none)\r\n","ExceptionType":"Microsoft.Practices.Unity.ResolutionFailedException","StackTrace":" at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides)\r\n at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides)\r\n at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer container, Type t, ResolverOverride[] overrides)\r\n at Microsoft.Practices.Unity.WebApi.UnityDependencyResolver.SharedDependencyScope.GetService(Type serviceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"The current type, Microsoft.AspNet.Identity.IUserStore`2[HiQ.Repository.EntityFramework.Identity.BaseApplicationUser,System.Int32], is an interface and cannot be constructed. Are you missing a type mapping?","ExceptionType":"System.InvalidOperationException","StackTrace":" at Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext context)\r\n at lambda_method(Closure , IBuilderContext )\r\n at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.b__0(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)\r\n at Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)\r\n at lambda_method(Closure , IBuilderContext )\r\n at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.b__0(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)\r\n at Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)\r\n at lambda_method(Closure , IBuilderContext )\r\n at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.b__0(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides)"}}}
最初的问题是 Unity 试图用两个参数调用构造函数:
public AccountController(ApplicationUserManager userManager,
ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
UserManager = userManager;
AccessTokenFormat = accessTokenFormat;
}
通过添加以下行,告诉 Unity 调用无参数构造函数,一切又恢复正常了。
container.RegisterType<AccountController>(new InjectionConstructor());