it-swarm.com.ru

Произошла ошибка при попытке создать контроллер типа "EmployeeController". Убедитесь, что у контроллера есть открытый конструктор без параметров

Почему я получаю эту ошибку на Контроллере сотрудников, остальные работают отлично Вот мой Контроллер сотрудников 

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

И это мой отлично работающий контроллер продукта

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

Вот трассировка стека 

Произошла ошибка. Произошла ошибка при попытке создать контроллер типа «EmployeeController». Убедитесь, что у контроллера есть открытый параметр без параметров. System.InvalidOperationException в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (запрос HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) & # xD; в System.Web.Http.Controllers.HttpControllerDescriptor.CreateController (запрос HttpRequestMessage) & # xD; at System.Web.Http.Dispatcher.HttpControllerDispatcher. <SendAsync> d__1.MoveNext () Произошла ошибка. Не удалось устранить зависимость, type = "TheWork.Controllers.EmployeeController", name = "(none)". & # XD; Исключение произошло во время: при разрешении. & # XD; Исключение: InvalidOperationException - Текущий тип, BusinessServices.IEmployeeServices, является интерфейсом и не может быть создан. Вам не хватает отображения типов? & # XD; ----------------------------------------------- & # XD ; На момент исключения контейнер был: & # xD; & # XD; Разрешение TheWork.Controllers.EmployeeController, (нет) & # xD; Разрешение параметра "employeeServices" конструктора TheWork.Controllers.EmployeeController (BusinessServices.IEmployeeServices employeeServices) & # xD; Разрешение BusinessServices.IEmployeeServices, (нет) & # xD; Microsoft.Practices.Unity.ResolutionFailedException в Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Тип t, Объект существует, Имя строки, 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; в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (запрос HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) Произошла ошибка. Текущий тип, BusinessServices.IEmployeeServices, является интерфейсом и не может быть создан. Вам не хватает отображения типов? System.InvalidOperationException в Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface (контекст IBuilderContext) & # xD; at lambda_method (Closure, IBuilderContext) & # xD; в Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext. <> c__DisplayClass1. <GetBuildMethod> b__0 (контекст IBuilderContext) & # xD; в Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp (контекст IBuilderContext) & # xD; в Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (контекст IBuilderContext) & # xD; в Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (контекст IBuilderContext) & # xD; в Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp (NamedTypeBuildKey newBuildKey) & # xD; в Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve (контекст IBuilderContext) & # xD; at lambda_method (Closure, IBuilderContext) & # xD; в Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext. <> c__DisplayClass1. <GetBuildMethod> b__0 (контекст IBuilderContext) & # xD; в Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp (контекст IBuilderContext) & # xD; в Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (контекст IBuilderContext) & # xD; в Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (контекст IBuilderContext) & # xD; в Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Тип t, Объект существует, Имя строки, IEnumerable`1 resolverOverrides)

Обновление

Вот Конфигурация Unity 

   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

В трассировке стека скрыта основная причина проблемы:

InvalidOperationException - Текущий тип, BusinessServices.IEmployeeServices, является интерфейсом и не может быть построено. Вам не хватает отображения типов? ----------------------------------------------- В это время Исключением был контейнер: Разрешение TheWork.Controllers.EmployeeController, (нет) Параметр разрешения "employeeServices" конструктора TheWork.Controllers.EmployeeController (BusinessServices.IEmployeeServices EmployeeServices) Разрешение BusinessServices.IEmployeeServices, (нет) Microsoft.Practices.Unity.ResolutionFailedException at Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Тип t, Объект Существующий, Строковое имя, IEnumerable1 resolverOverrides)

Проблема заключается в том, что для EmployeeController требуется экземпляр IEmployeeServices, но Unity не знает, какой конкретный тип создать. Похоже, что класс реализации должен быть зарегистрирован вызовом ComponentLoader.LoadContainer(container, ".\\bin", "BusinessServices.dll");, но по какой-то причине он не регистрируется. Это может быть ошибка в этом коде или, возможно, BusinessServices.dll устарела и не содержит определения IEmployeeServices.

Трудно сказать, почему IEmployeeServices не зарегистрирован, не видя весь код и зависимости времени выполнения (потому что типы динамически загружаются/регистрируются).

9
Randy Levy

Убедитесь, что у контроллера есть открытый конструктор без параметров

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