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, IEnumerable
1 resolverOverrides)
 at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides)
 at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer container, Type t, ResolverOverride[] overrides)
 at Unity.WebApi.UnityDependencyScope.GetService(Type serviceType)
 at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func
1 & 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");
}
}
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).
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;
}
}