首页 文章

ASP.NET Web API安装的Unity bootstrapper - 尝试创建'AccountController'类型的控制器时发生错误

提问于
浏览
1

我之前使用过教程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”:“发生错误 . ”,“ExceptionMessage”:“尝试创建'AccountController'类型的控制器时发生错误 . 确保控制器具有无参数的公共构造函数 . ”,“ExceptionType” :“System.InvalidOperationException”,“StackTrace”:“at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,HttpControllerDescriptor controllerDescriptor,Type controllerType)\ r \ n在System.Web.Http.Controllers.HttpControllerDescriptor.CreateController (HttpRequestMessage请求)\ r \ n在System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()“,”InnerException“:{”消息“:”发生错误 . “,”ExceptionMessage“:”依赖项失败,类型= \“Project.Sales.Web.Controllers.AccountController \”,name = \“(none)\” . \ r \ n发生异常时:解析时 . \ r \ nException是:InvalidOperationException - 当前type,Microsoft.AspNet.Identity.IUserStore2 [HiQ.Repository.EntityFramework.Identity.B aseApplicationUser,System.Int32]是一个接口,无法构造 . 你错过了类型映射吗?\ r \ n --------------------------------------- -------- \ r \ n在异常时,容器是:\ r \ n \ r \ n解析Project.Sales.Web.Controllers.AccountController,(无)\ r \ n解析参数构造函数Project.Sales.Web.Controllers.AccountController的“userManager”(Project.Sales.Web.ApplicationUserManager userManager,Microsoft.Owin.Security.ISecureDataFormat1 [[Microsoft.Owin.Security.AuthenticationTicket,Microsoft.Owin.Security] ,Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35]] accessTokenFormat)\ r \ n解析Project.Sales.Web.ApplicationUserManager,(无)\ r \ n解析构造函数Project.Sales的参数\“store \” .Web.ApplicationUserManager(Microsoft.AspNet.Identity.IUserStore2 [[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解析Microsoft.AspNet.Identity.IUserStore2 [HiQ.Repository.EntityFramework.Identity.BaseApplicationUser,System.Int32],(无)\ r \ n“,”ExceptionType“:”Microsoft.Practices . Unity.ResolutionFailedException“,”StackTrace“:”at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t,Object existing,String name,IEnumerable1 resolverOverrides)\ r \ n在Microsoft.Practices.Unity.UnityContainer.Resolve(在Microsoft.Practices.Unity.WebApi的Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer容器,Type t,ResolverOverride []覆盖)\ r \ n中输入t,String name,ResolverOverride [] resolverOverrides)\ r \ n . 在System.Web.Http.Dispatcher的System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage请求,类型controllerType,Func1和激活器)\ r \ n的UnityDependencyResolver.SharedDependencyScope.GetService(类型serviceType)\ r \ n . DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor c ontrollerDescriptor,Type controllerType)“,”InnerException“:{”Message“:”发生错误 . “,”ExceptionMessage“:”当前类型,Microsoft.AspNet.Identity.IUserStore2 [HiQ.Repository.EntityFramework.Identity .BaseApplicationUser,System.Int32]是一个无法构造的接口 . 你是否缺少类型映射?“,”ExceptionType“:”System.InvalidOperationException“,”StackTrace“:”在Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext context)\ r \ n在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 atMicrosoft.Practices.ObjectBuilder2.BuildPrateStrategy.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上下文\ r \ n在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在Microsoft.Practices.Unity.Object在Microsoft.Practices的Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext . <> c__DisplayClass1.b__0(IBuilderContext context)\ r \ n的lambda_method(Closure,IBuilderContext)\ r \ n的Builder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)\ r \ n Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)\ r \ n中的.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)\ r在Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t,Object existing,String name,IEnumerable1 resolverOverrides)“}}}

1 回答

  • 1

    原来的问题是Unity试图用两个参数调用构造函数:

    public AccountController(ApplicationUserManager userManager,
        ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
    {
        UserManager = userManager;
        AccessTokenFormat = accessTokenFormat;
    }
    

    通过添加以下行告诉Unity调用无参数构造函数,一切都工作了 .

    container.RegisterType<AccountController>(new InjectionConstructor());
    

相关问题