1

J'ai précédemment utilisé l'injection de dépendance Unity du tutoriel Dependency Injection in ASP.NET Web API 2.Installateur Unity bootstrapper pour API Web ASP.NET - Une erreur est survenue lors de la tentative de création d'un contrôleur de type 'AccountController'

Cependant, je voulais utiliser HierarchicalLifetimeManager alors j'ai installé Unity bootstrapper for ASP.NET Web API.

Cependant, cela m'a donné une erreur que je n'avais pas auparavant dans AccountController. De ce que je peux dire il a quelque chose à voir avec le IUserStore mais ce que je ne comprends pas c'est pourquoi cette erreur se produit après l'installation de ce NuGet. Unity a été installé et utilisé auparavant et je n'ai pas eu à enregistrer les types pour 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": "Une erreur est survenue", "ExceptionMessage": "Une erreur est survenue lors essayant de créer un contrôleur de type « AccountController . » Assurez-vous que le contrôleur a un constructeur public sans paramètre "" ExceptionType. ":" System.InvalidOperationException " "StackTrace":" à System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpRequestMessage re quête, HttpControllerDescriptor controllerDescriptor, type controllerType) \ r \ n à System.Web.Http.Controllers.HttpControllerDescriptor.CreateController (HttpRequestMessage demande) \ r \ n à System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext() "," InnerException ": {" Message ":" Une erreur s'est produite. "," ExceptionMessage ":" La résolution de la dépendance a échoué, tapez = \ "Project.Sales.Web.Controllers.AccountController \", name = \ "(aucun) \". \ R \ nException survenue pendant: résolution. \ R \ nException: InvalidOperationException - Le type actuel, Microsoft.AspNet.Identity.IUserStore`2 [HiQ.Repository. EntityFramework.Identity.BaseApplicationUser, System.Int32], est une interface et ne peut pas être construit. Vous manque un mappage de type ? \ R \ n -------------------------------------- --------- \ r \ nAu moment de l'exception , le conteneur était: \ r \ n \ r \ n Résolution Project.Sales.Web.Controllers.AccountController, (aucun) \ r \ n Résolution paramètre \ "userManager \" du constructeur 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 Résolution Project.Sales.Web.ApplicationUserManager, (none) \ r \ n Résolution para meter \ "store \" du constructeur Project.Sales.Web.ApplicationUserManager (Microsoft.AspNet.Identity.IUserStore`2 [[HiQ.Repository.EntityFramework.Identity.BaseApplicationUser, HiQ.Repository.EntityFramework, Version = 0.1.2.0 Culture = neutre, PublicKeyToken = null], [System.Int32, mscorlib, version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089]] magasin) \ r \ n Résolution Microsoft.AspNet.Identity.IUserStore `2 [HiQ.Repository.EntityFramework.Identity.BaseApplicationUser, System.Int32], (aucun) \ r \ n", "ExceptionType": "Microsoft.Practices.Unity.ResolutionFailedException", "StackTrace": " at Microsoft. Practices.Unity.UnityContainer.DoBuildUp (Type t, Object existant, Nom de la chaîne, IEnumerable`1 resolverOverrides) \ r \ n à Microsoft.Practices.Unity.UnityContainer.Resolve (Type t, Nom de la chaîne, ResolverOverride [] resolverOverrides) \ r \ n at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve (IUnityContainer récipient , type t, ResolverOverride [] remplacements) \ r \ n à Microsoft.Practices.Unity.WebApi.UnityDependencyResolver.SharedDependencyScope.GetService (type serviceType) \ r \ n à System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator (HttpRequestMessage demande, type controllerType, Func`1 activateur &) \ r \ n à System.Web.Http.Dispatcher.DefaultHttpContr ollerActivator.Create (HttpRequestMessage demande, HttpControllerDescriptor controllerDescriptor, type controllerType) " "InnerException": { "message": "Une erreur est survenue ", "ExceptionMessage.":" Le type actuel, Microsoft.AspNet.Identity .IUserStore`2 [HiQ.Repository.EntityFramework.Identity.BaseApplicationUser, System.Int32], est une interface et ne peut pas être construit. Il vous manque un mappage de type " "ExceptionType?": "System.InvalidOperationException", "StackTrace":" à Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface (IBuilderContext contexte) \ r \ n à lambda_method (fermeture , IBuilderContext) \ r \ n à Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext. <> c__DisplayClass1.b__0 (IBuilderContext contexte) \ r \ n à Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp (IBuilderContext contexte) \ r \ n à Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (contexte IBuilderContext ) \ r \ n à Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (contexte IBuilderContext ) \ r \ n à Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp (NamedTypeBuildKey newBuildKey) \ r \ n à Microsoft.Practices. Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve (IBuilderContext contexte) \ r \ n à lambda_method (Fermeture, IBuilderContext) \ r \ n à Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext. <> c__DisplayClass1.b__0 (IBuilderContext contexte) \ r \ n à Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp (IBuilderContext contexte) \ r \ n à Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (contexte IBuilderContext ) \ r \ n à Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (contexte IBuilderContext ) \ r \ n à Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp (NamedTypeBuildKey newBuildKey) \ r \ n à Microsoft.Practices. Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve (IBuilderContext contexte) \ r \ n à lambda_method (Fermeture, IBuilderContext) \ r \ n à Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext. <> c__DisplayClass1.b__0 (IBuilderContext contexte) \ r \ n à Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp (IBuilderContext contexte) \ r \ n à Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (contexte IBuilderContext ) \ r \ n à Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (IBuilderContext contexte) \ r \ n à Microsoft.Practices.Unity.UnityContainer.DoBuildUp (type t, objet existant, String name, IEnumerable`1 resolverOverrides) "}}}

+0

si le 'AccountController' reçoit un paramètre de type' IUserStore' alors vous devrez enregistrer une œuvre ment pour ce type, ou l'unité ne pourra pas faire une instance du contrôleur. – meJustAndrew

+0

Veuillez arrêter d'utiliser Unity pour les nouveaux projets. L'unité est morte https://github.com/unitycontainer/unity/issues. Il n'y aura plus de versions pour Unity. Aucune correction de bogue Pas de support. – NightOwl888

+0

@ NightOwl888 Que recommandez-vous à la place? – Ogglas

Répondre

1

problème original pour cela était que l'unité a essayé d'appeler le constructeur avec deux paramètres:

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

en ajoutant l'unité ligne suivante dit d'appeler le tout constructeur a travaillé à nouveau parameterless.

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