【问题标题】:Error occurred when trying to create a controller of type 'EmployeeController'. Make sure controller has a parameterless public constructor尝试创建类型为“EmployeeController”的控制器时发生错误。确保控制器有一个无参数的公共构造函数
【发布时间】:2017-12-22 23:15:13
【问题描述】:

为什么我在 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;
        }
}

这是我完美的工作产品控制器

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.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 处具有无参数的公共构造函数。System.InvalidOperationException 在 System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage 请求) 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext() 发生错误。依赖项解析失败,type = "TheWork.Controllers.EmployeeController", name = "(none)"。 异常发生时:解决时。 异常是: InvalidOperationException - 当前类型 BusinessServices.IEmployeeServices 是一个接口,无法构造。您是否缺少类型映射? ----------------------------------------------------------- 在异常发生时,容器是: 解决 TheWork.Controllers.EmployeeController,(none) 解析构造函数 TheWork.Controllers.EmployeeController(BusinessServices.IEmployeeServicesemployeeServices) 的参数“employeeServices” 解决 BusinessServices.IEmployeeServices,(无) Microsoft.Practices.Unity.ResolutionFailedException 在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型 t,现有对象,字符串名称,IEnumerable1 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, Func1& 激活器) 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)出现错误。当前类型BusinessServices.IEmployeeServices是接口,无法构造。您是否缺少类型映射?Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext context) 处的 System.InvalidOperationException 在 lambda_method(闭包,IBuilderContext) 在 Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.c__DisplayClass1.b__0(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) 在 Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext 上下文) 在 lambda_method(闭包,IBuilderContext) 在 Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.c__DisplayClass1.b__0(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) 在 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");
        }
}

【问题讨论】:

  • 你的统一配置是什么样的?
  • @ChrisBint Chris 我添加了 Config 类请看问题的更新部分

标签: c# .net asp.net-mvc asp.net-web-api unity-container


【解决方案1】:

隐藏在堆栈跟踪中是问题的根本原因:

InvalidOperationException - 当前类型, BusinessServices.IEmployeeServices,是一个接口,不能是 已建成。您是否缺少类型映射? - - - - - - - - - - - - - - - - - - - - - - - - 当时异常中,容器是:正在解决 TheWork.Controllers.EmployeeController,(none) 解析参数 构造函数的“employeeServices” TheWork.Controllers.EmployeeController(BusinessServices.IEmployeeServices employeeServices) 正在解决 BusinessServices.IEmployeeServices,(无) Microsoft.Practices.Unity.ResolutionFailedException 在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型 t,对象 现有,字符串名称,IEnumerable1 resolverOverrides)

问题是EmployeeController 需要IEmployeeServices 的实例,但Unity 不知道要实例化什么具体类型。看起来实现类应该通过调用ComponentLoader.LoadContainer(container, ".\\bin", "BusinessServices.dll"); 来注册,但由于某种原因它没有被注册。这可能是该代码中的错误,或者 BusinessServices.dll 已过期并且不包含 IEmployeeServices 定义。

如果不查看所有代码和运行时依赖项(因为类型是动态加载/注册的),很难说出为什么没有注册 IEmployeeServices

【讨论】:

  • 谢谢您,先生,您让我更深入地了解,我很抱歉这是我的错误,我没有更新我的DependencyResolver 课程。 registerComponent.RegisterType<IEmployeeServices,EmployeeServices>();
【解决方案2】:

试试这个方法:)

        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IEmployeeServices >().To<EmployeeServices >().InRequestScope();
        }

【讨论】:

    猜你喜欢
    • 2022-11-04
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多