Ошибка создания контроллера, указывающая, что контроллеру нужен открытый конструктор без параметров - PullRequest
0 голосов
/ 16 мая 2018

Ошибка создания контроллера типа '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();
        }

StackTrace

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

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Проблема возникла из-за неправильной настройки IDbFactory.

0 голосов
/ 16 мая 2018

Как указано в документации, вам необходимо установить средство разрешения зависимостей :

После сборки вашего контейнера передайте его в новый экземпляр класса AutofacWebApiDependencyResolver.Присоедините новый преобразователь к вашему HttpConfiguration.DependencyResolver, чтобы веб-API знал, что он должен находить службы с помощью AutofacWebApiDependencyResolver.Это реализация Autofac интерфейса IDependencyResolver.

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

Я могу сказать, что вы этого не делаете, потому что трассировка стека специально указывает, какой преобразователь используется для создания контроллеров:

System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator (запрос HttpRequestMessage, тип controllerType, Func`1 & activator)

...