【问题标题】:Create Controller Failure stating that the controller needs a parameterless public constructor创建控制器失败,说明控制器需要一个无参数的公共构造函数
【发布时间】:2018-05-16 16:42:30
【问题描述】:

“UserController”类型的创建控制器失败。确保 控制器有一个无参数的公共构造函数

使用 AutoFac,我注册了 UnitOfWork 存储库,如下所示,我还粘贴了控制器代码和堆栈跟踪。请协助。无法理解为什么控制器需要无参数的公共构造函数。

private static IContainer RegisterServices(ContainerBuilder builder)
        {
            //Register your Web API controllers.  
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

            builder.RegisterType<UserContext>().As<DbContext>().InstancePerRequest();
            builder.RegisterType<DBFactory>().As<IDBFactory>().InstancePerRequest();
            builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
            builder.RegisterGeneric(typeof(GenericRepo<>)).As(typeof(IGenericRepo<>)).InstancePerRequest();

            //Set the dependency resolver to be Autofac.  
            Container = builder.Build();

            return Container;
        }  

private readonly IUnitOfWork _unitofwork;
        public UserController(IUnitOfWork uow)
        {
            _unitofwork = uow;
        }
        [HttpGet]
        public IEnumerable<UserDetail> UserData()
        {
            return _unitofwork.userDetail.GetAllUsers();
        }

堆栈跟踪

  at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
       at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
       at Autofac.Core.Resolving.InstanceLookup.<Execute>b__0()
       at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator)
       at Autofac.Core.Resolving.InstanceLookup.Execute()
       at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
       at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
       at Autofac.Core.Activators.Reflection.AutowiringParameter.<>c__DisplayClass2.<CanSupplyValue>b__0()
       at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()
       at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
       at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
       at Autofac.Core.Resolving.InstanceLookup.Execute()
       at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
       at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
       at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)
       at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
       at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
       at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)
       at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
       at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType)
       at Autofac.Integration.WebApi.AutofacWebApiDependencyScope.GetService(Type serviceType)
       at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
       at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)

控制器:

public class UserController : ApiController
{
  private readonly IUnitOfWork _unitofwork;
  public UserController(IUnitOfWork uow)
  {
      _unitofwork = uow;
  }

  [HttpGet]
  public IEnumerable<UserDetail> UserData()
  {
      return _unitofwork.userDetail.GetAllUsers();
  }
}

【问题讨论】:

  • 只是为了检查 - 您实际上已将 AutoFac 注册为 DependencyResolverper here
  • 你也注册UserContorller了吗?
  • 不,我没有。我需要在哪里注册?但是 UnitOfWork 已注册。
  • 请分享Startup类
  • @MarcusHöglund 你的意思是 AutofacWebapiConfig 类吗?没有 Startup.cs

标签: c# asp.net-web-api dependency-injection autofac


【解决方案1】:

As stated in the documentation, you need set the dependency resolver:

构建容器后,将其传递给 AutofacWebApiDependencyResolver 类的新实例。将新的解析器附加到您的 HttpConfiguration.DependencyResolver 以让 Web API 知道它应该使用 AutofacWebApiDependencyResolver 定位服务。这是 Autofac 对 IDependencyResolver 接口的实现。

var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

我可以告诉你没有这样做,因为堆栈跟踪明确说明了它用于创建控制器的解析器:

System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)

【讨论】:

  • 这就是我的做法:config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
  • 你用的是什么版本?
  • Autofac.Integration.WebApi(4.1 版)Autofac(4.8 版)
  • 您能否更新您的代码,了解 config.DependencyResolve 发生的位置。还要添加不工作的控制器。
  • 不要将代码添加为 cmets,点击帖子下方的Edit 按钮并将其添加为代码。
【解决方案2】:

问题是由于 IDbFactory 设置错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2016-06-20
    相关资源
    最近更新 更多