Ни один из конструкторов не найден с 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder - PullRequest
1 голос
/ 25 апреля 2019

Я работаю на Azure functions с Autofac контейнером. Я реализовал шаблон общего репозитория в проекте для взаимодействия с бэкендом.

Я не уверен, что я делаю что-то не так, может быть, есть проблема при регистрации универсальных типов.

Если я удалю общую часть репозитория из моего проекта, она будет работать нормально.

Я просмотрел все ссылки на переполнение стека, но не нашел подходящего решения.

Я столкнулся с приведенной ниже ошибкой при запуске функции.

Выполнено 'sort' (Ошибка, Id = 2cebaac1-a63e-4cf8-b82f-68e2ebeeb32d) [25.04.2009 12:28:18] System.Private.CoreLib: исключение при выполняющая функция: сортировка. Microsoft.Azure.WebJobs.Host: исключение обязательный параметр _chargeOptionsServcie. Autofac: произошла ошибка во время активации определенной регистрации. Увидеть внутренний исключение для деталей. Регистрация: Activator = ChargeOptionsService (ReflectionActivator), Услуги = [Awemedia.Chargestation.Business.Interfaces.IChargeOptionsServcie], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Нет, Ownership = OwnedByLifetimeScope ---> Ни один из конструкторов не найден с 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' на тип 'Awemedia.Chargestation.Business.Services.ChargeOptionsService' можно вызвать с помощью доступных служб и параметров:

вот мой код функции:

[DependencyInjectionConfig(typeof(DIConfig))]
    public class Function1
    {
        [FunctionName("Function1")]
        public HttpResponseMessage Get(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestMessage req, [Inject]IChargeOptionsServcie _chargeOptionsServcie, [Inject]IErrorHandler _errorHandler)
        {
            return req.CreateResponse(HttpStatusCode.OK, _chargeOptionsServcie.GetAll());
        }
    }

Вот мой сервисный код:

public class ChargeOptionsService : IChargeOptionsServcie
    {

        private readonly IBaseService<ChargeOptions> _baseService;
        private readonly IMapper _mapper;

        public ChargeOptionsService(IBaseService<ChargeOptions> baseService, IMapper mapper)
        {
            _baseService = baseService;
            _mapper = mapper;
        }


        public IEnumerable<ChargeOptionsResponse> GetAll()
        {
            return _baseService.GetAll().Select(t => _mapper.Map<ChargeOptions, ChargeOptionsResponse>(t));
        }

    }

вот мой DIConfig.cs код, где я регистрирую свои зависимости:

public class DIConfig
    {
        public DIConfig(string functionName)
        {
            DependencyInjection.Initialize(builder =>
            {

                builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IBaseRepository<>));
                builder.RegisterGeneric(typeof(BaseService<>)).As(typeof(IBaseService<>));

                builder.RegisterType<ErrorHandler>().As<IErrorHandler>();
                builder.RegisterType<ChargeOptionsService>().As<IChargeOptionsServcie>();
                builder.RegisterType<EventsService>().As<IEventsService>();
            }, functionName);
        }
    }

Мой базовый класс обслуживания:

public class BaseService<T> : IBaseService<T>
    {
        private readonly IBaseRepository<T> _repository;

        public BaseService(IBaseRepository<T> repository)
        {
            _repository = repository;
        }

        public IEnumerable<T> GetAll()
        {
            return _repository.GetAll();
        }

        public T GetById(int id)
        {
            return _repository.GetById(id);
        }

        public IEnumerable<T> Where(Expression<Func<T, bool>> exp)
        {
            return _repository.Where(exp);
        }

        public T AddOrUpdate(T entry, int Id)
        {
            var targetRecord = _repository.GetById(Id);
            var exists = targetRecord != null;

            if (exists)
            {
                _repository.Update(entry);
            }
            _repository.Insert(entry);
            return entry;
        }
        public T AddOrUpdate(T entry, Guid guid)
        {
            var targetRecord = _repository.GetById(guid);
            var exists = targetRecord != null;

            if (exists)
            {
                _repository.Update(entry);
            }
            _repository.Insert(entry);
            return entry;
        }
        public void Remove(int id)
        {
            var label = _repository.GetById(id);
            _repository.Delete(label);
        }

        public bool InsertBulk(IEnumerable<T> entities)
        {
            return _repository.InsertBulk(entities);
        }

        public T GetById(Guid guid)
        {
            return _repository.GetById(guid);
        }
    }

Вот мой базовый репозиторий:

public class BaseRepository<T> : IBaseRepository<T> where T : class
    {

        private readonly Context _context;

        private readonly DbSet<T> _entities;

        private readonly IErrorHandler _errorHandler;

        public BaseRepository(AwemediaContext context, IErrorHandler errorHandler)
        {
            _context = context;
            _entities = context.Set<T>();
            _errorHandler = errorHandler;
        }
        public IEnumerable<T> GetAll()
        {
            return _entities.ToList();
        }
        public T GetById(int id)
        {
            return _entities.Find(id);
        }

        public IEnumerable<T> Where(Expression<Func<T, bool>> exp)
        {
            return _entities.Where(exp);
        }
        public T Insert(T entity)
        {
            if (entity == null) throw new ArgumentNullException(string.Format(_errorHandler.GetMessage(ErrorMessagesEnum.EntityNull), "", "Input data is null"));
            _entities.AddAsync(entity);
            _context.SaveChanges();
            return entity;
        }
        public void Update(T entity)
        {
            if (entity == null) throw new ArgumentNullException(string.Format(_errorHandler.GetMessage(ErrorMessagesEnum.EntityNull), "", "Input data is null"));

            var oldEntity = _context.Find<T>(entity);
            _context.Entry(oldEntity).CurrentValues.SetValues(entity);
            _context.SaveChanges();
        }
        public void Delete(T entity)
        {
            if (entity == null) throw new ArgumentNullException(string.Format(_errorHandler.GetMessage(ErrorMessagesEnum.EntityNull), "", "Input data is null"));

            _entities.Remove(entity);
            _context.SaveChanges();
        }
        public bool InsertBulk(IEnumerable<T> entities)
        {
            bool result = false;
            if (entities.Count() > 0)
            {
                _entities.AddRange(entities);
                _context.SaveChanges();
                result = true;
            }
            return result;
        }
        public T GetById(Guid guid)
        {
            return _entities.Find(guid);
        }

    }

Пожалуйста, помогите мне. Я ломаю голову последние три дня.

enter image description here

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Ни один из конструкторов, найденных с Autofac.Core.Activators.Reflection.DefaultConstructorFinder для типа Awemedia.Chargestation.Business.Services.ChargeOptionsService, не может быть вызван с доступными службами и параметрами:

Это сообщение об ошибке означает, что Autofac не может создать ChargeOptionsService, потому что одна из обязательных зависимостей не была зарегистрирована.Если вы посмотрите на ваш ChargeOptionsService конструктор, вы увидите, что есть 2 зависимости:

public ChargeOptionsService(IBaseService<ChargeOptions> baseService, IMapper mapper)
{
    _baseService = baseService;
    _mapper = mapper;
}
  • IBaseService<ChargeOptions> baseService.Эта зависимость регистрируется следующей строкой

    builder.RegisterGeneric(typeof(BaseService<>)).As(typeof(IBaseService<>));
    
    • IMapper mapper.Эта зависимость не зарегистрирована.

Чтобы исправить ошибку, вам необходимо зарегистрировать IMapper.Что-то вроде

builder.RegisterType<Mapper>().As<IMapper>();

не может разрешить параметры AwemediaContext

Это сообщение об ошибке почти то же самое, это означает, что для одной из ваших зависимостей требуется AwemediaContextне зарегистрирован.

0 голосов
/ 25 апреля 2019

вы пробовали это:

// Register types that expose interfaces...
builder.RegisterType<BaseService<ChargeOptions>>.As(typeof(IBaseService<ChargeOptions>));

В противном случае измените код службы ChargeOptionsService. Дайте ему конструктор по умолчанию. посмотрите, работает ли это, заново добавьте аргумент constrcutor один за другим и посмотрите, где он идет не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...