web-dev-qa-db-fra.com

Une erreur s'est produite lors de la tentative de création d'un contrôleur de type 'EmployeeController'. Assurez-vous que le contrôleur a un constructeur public sans paramètre

Pourquoi je reçois cette erreur sur Employee Controller, le reste d'entre eux fonctionne parfaitement Voici mon contrôleur d'employé 

public class EmployeeController : ApiController
    {
        #region Call service
        private readonly IEmployeeServices _employeeServices;
        public EmployeeController(IEmployeeServices employeeServices)
        {
            _employeeServices = employeeServices;
        }

        readonly IEmployeeServices employeeServices = new EmployeeServices();

        public EmployeeController():base()
        {
            _employeeServices = employeeServices;
        }
}

ET ceci est mon contrôleur de produit qui fonctionne parfaitement

public class ProductController : ApiController
    {
        #region Call service

        private readonly IProductServices _productServices;

        public ProductController(IProductServices productServices)
        {
            _productServices = productServices;
        }

        readonly IProductServices productServices = new ProductServices();

        public ProductController()
        {
            _productServices = productServices;
        }
}

Voici la trace de la pile 

Une erreur s'est produite. Une erreur s'est produite lors de la tentative de création d'un contrôleur de type 'EmployeeController'. Assurez-vous que le contrôleur a un constructeur public sans paramètre. System.InvalidOperationException à System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (demande HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) & # xD; à System.Web.Http.Controllers.HttpControllerDescriptor.CreateController (demande HttpRequestMessage) & # xD; at System.Web.Http.Dispatcher.HttpControllerDispatcher. <SendAsync> d__1.MoveNext () Une erreur est survenue.La résolution de la dépendance a échoué, tapez = "TheWork.Controllers.EmployeeController", nom = "(non)". xD; Une exception est survenue pendant: la résolution. & # XD; L'exception est la suivante: InvalidOperationException - Le type actuel, BusinessServices.IEmployeeServices, est une interface et ne peut pas être construit. Il vous manque un mappage de types? & # XD; ----------------------------------------------- & # xD ; Au moment de l’exception, le conteneur était: & # xD; & # xD; Résolution de TheWork.Controllers.EmployeeController, (none) & # xD; Résolution du paramètre "employeeServices" du constructeur TheWork.Controllers.EmployeeController (BusinessServices.IEmployeeServices employeeServices) & # xD; Résolution de BusinessServices.IEmployeeServices, (none) & # xD; Microsoft.Practices.Unity.ResolutionFailedException at Microsoft.Practices.Unity.UnityContainer.DoBuildUp (type t, objet existant, nom de chaîne, IEnumerable1 resolverOverrides)&#xD; at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides)&#xD; at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer container, Type t, ResolverOverride[] overrides)&#xD; at Unity.WebApi.UnityDependencyScope.GetService(Type serviceType)&#xD; at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func1 & activator) & # xD; at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (demande HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) Une erreur s'est produite. Le type actuel, BusinessServices.IEmployeeServices, est une interface et ne peut pas être construit. Il vous manque un mappage de type? System.InvalidOperationException chez Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface (contexte IBuilderContext) & # xD; à lambda_method (Closure, IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext. <> c__DisplayClass1. <GetBuildMethod> b__0 (contexte IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp (contexte IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (contexte IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (contexte IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp (NamedTypeBuildKey newBuildKey) & # xD; at Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve (contexte IBuilderContext) & # xD; à lambda_method (Closure, IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext. <> c__DisplayClass1. <GetBuildMethod> b__0 (contexte IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp (contexte IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (contexte IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (contexte IBuilderContext) & # xD; sur Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Type t, Objet existant, Nom de chaîne, IEnumerable`1 resolverOverrides)

Mettre à jour

Voici la configuration de l'unité 

   public static class UnityConfig
    {
        public static void RegisterComponents()
        {
            var container = new UnityContainer();
            System.Web.Mvc.DependencyResolver.SetResolver(new UnityDependencyResolver(container));

            GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);

            RegisterTypes(container);
        }

        public static void RegisterTypes(IUnityContainer container)
        {
            ComponentLoader.LoadContainer(container, ".\\bin", "TheWork.dll");
            ComponentLoader.LoadContainer(container, ".\\bin", "BusinessServices.dll");
            ComponentLoader.LoadContainer(container, ".\\bin", "DataModel.dll");
        }
}
3
Dummy

Enfoui dans la trace de la pile est la cause première du problème:

InvalidOperationException - Le type actuel, BusinessServices.IEmployeeServices, est une interface et ne peut pas être construit. Il vous manque un mappage de type? ----------------------------------------------- À l'époque de l'exception, le conteneur était: Résolution TheWork.Controllers.EmployeeController, (aucun) Paramètre de résolution "employeeServices" du constructeur TheWork.Controllers.EmployeeController (BusinessServices.IEmployeeServices EmployeeServices) Résolution de BusinessServices.IEmployeeServices, (aucun) Microsoft.Practices.Unity.ResolutionFailedException à Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Type t, Objet Existant, Nom de la chaîne, IEnumerable1 resolverOverrides)

Le problème est que EmployeeController nécessite une instance de IEmployeeServices mais Unity ne sait pas quel type concret instancier. Il semble que la classe d'implémentation soit censée être enregistrée par l'appel à ComponentLoader.LoadContainer(container, ".\\bin", "BusinessServices.dll"); mais, pour une raison quelconque, elle n'est pas enregistrée. Il peut s'agir d'un bogue dans ce code ou peut-être que BusinessServices.dll est obsolète et ne contient pas la définition IEmployeeServices.

Il est difficile de dire pourquoi IEmployeeServices n'est pas enregistré sans afficher tous les dépendances de code et d'exécution (car les types sont chargés/enregistrés de manière dynamique).

9
Randy Levy

Assurez-vous que le contrôleur a un constructeur public sans paramètre

public class EmployeeController : ApiController
    {
        #region Call service
        private readonly IEmployeeServices _employeeServices;
        public EmployeeController(IEmployeeServices employeeServices)
        {
            _employeeServices = employeeServices;
        }

        readonly IEmployeeServices employeeServices = new EmployeeServices();

        public EmployeeController()
        {
            _employeeServices = employeeServices;
        }
}
0
Leon Barkan