it-swarm.com.de

Beim Versuch, eine Steuerung des Typs 'EmployeeController' zu erstellen, ist ein Fehler aufgetreten. Stellen Sie sicher, dass der Controller über einen öffentlichen Parameter ohne Parameter verfügt

Warum erhalte ich diesen Fehler bei Employee Controller? Der Rest von ihnen funktioniert einwandfrei. Hier ist mein Employee Controller 

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;
        }
}

UND das ist mein perfekt funktionierender Produktcontroller

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;
        }
}

Hier ist der Stack-Trace 

Es ist ein Fehler aufgetreten. Beim Versuch, eine Steuerung des Typs 'EmployeeController' zu erstellen, ist ein Fehler aufgetreten. Stellen Sie sicher, dass der Controller über einen öffentlichen Parameter ohne Parameter verfügt.System.InvalidOperationException unter System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (Anforderung HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) & # xD; at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController (Anforderung HttpRequestMessage) & # xD; at System.Web.Http.Dispatcher.HttpControllerDispatcher. <SendAsync> d__1.MoveNext () Ein Fehler ist aufgetreten. Die Auflösung der Abhängigkeit ist fehlgeschlagen. type = "TheWork.Controllers.EmployeeController", name = "(none)". & # xD; Ausnahme während: beim Auflösen. & # XD; Ausnahme ist: InvalidOperationException - Der aktuelle Typ BusinessServices.IEmployeeServices ist eine Schnittstelle und kann nicht erstellt werden. Vermissen Sie eine Typenzuordnung? & # XD; ------------------------------------------- & # xD ; Zum Zeitpunkt der Ausnahme war der Container: & # xD; & # xD; Auflösen von TheWork.Controllers.EmployeeController, (keine) & # xD; Auflösen des Parameters "employeeServices" des Konstruktors TheWork.Controllers.EmployeeController (BusinessServices.IEmployeeServices employeeServices) & # xD; Auflösen von BusinessServices.IEmployeeServices, (keine) & # xD; Microsoft.Practices.Unity.ResolutionFailedException bei Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Typ t, Objekt vorhanden, Stringname, 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 (Anforderung HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Typ controllerType) Ein Fehler ist aufgetreten. Der aktuelle Typ BusinessServices.IEmployeeServices ist eine Schnittstelle und kann nicht erstellt werden. Fehlt eine Typzuordnung? System.InvalidOperationException bei Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface (IBuilderContext-Kontext) & # xD; at lambda_method (Schließung, IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext. <> c__DisplayClass1. <GetBuildMethod> b__0 (IBuilderContext-Kontext) & # xD; at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp (IBuilderContext-Kontext) & # xD; at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (IBuilderContext-Kontext) & # xD; at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (IBuilderContext-Kontext) & # xD; at Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp (NamedTypeBuildKey newBuildKey) & # xD; at Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve (IBuilderContext-Kontext) & # xD; at lambda_method (Schließung, IBuilderContext) & # xD; at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext. <> c__DisplayClass1. <GetBuildMethod> b__0 (IBuilderContext-Kontext) & # xD; at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp (IBuilderContext-Kontext) & # xD; at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (IBuilderContext-Kontext) & # xD; at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (IBuilderContext-Kontext) & # xD; at Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Typ t, Objekt vorhanden, Zeichenfolgenname, IEnumerable`1 resolverOverrides)

Update

Hier ist die Unity-Konfiguration 

   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

In der Stack-Trace begraben liegt die Ursache des Problems:

InvalidOperationException - Der aktuelle Typ BusinessServices.IEmployeeServices, ist eine Schnittstelle und kann nicht .__ sein. konstruiert. Vermissen Sie eine Typenzuordnung? ----------------------------------------------- Damals von der Ausnahme war der Container: Auflösen von TheWork.Controllers.EmployeeController, (keine) Auflösen des Parameters "employeeServices" des Konstruktors TheWork.Controllers.EmployeeController (BusinessServices.IEmployeeServices EmployeeServices) Auflösen von BusinessServices.IEmployeeServices, (keine) Microsoft.Practices.Unity.ResolutionFailedException um Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Geben Sie t, Object, Stringname, IEnumerable1 resolverOverrides ein.)

Das Problem ist, dass EmployeeController eine Instanz von IEmployeeServices erfordert, aber Unity nicht weiß, welchen konkreten Typ es instanziieren soll. Es sieht so aus, als sollte die Implementierungsklasse durch den Aufruf von ComponentLoader.LoadContainer(container, ".\\bin", "BusinessServices.dll"); registriert werden, aber aus irgendeinem Grund wird sie nicht registriert. Es könnte ein Fehler in diesem Code sein oder die BusinessServices.dll ist veraltet und enthält nicht die IEmployeeServices-Definition.

Es ist schwer zu sagen, warum IEmployeeServices nicht registriert ist, ohne den gesamten Code und die Laufzeitabhängigkeiten zu sehen (da Typen dynamisch geladen/registriert werden).

9
Randy Levy

Stellen Sie sicher, dass der Controller über einen öffentlichen Parameter ohne Parameter verfügt

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