Ни один из конструкторов не найден с 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder
Я работаю над 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, Совместное использование = Нет, Владение = OwnedByLifetimeonescope ---> 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);
}
}
Пожалуйста, помогите мне. Я ломаю голову последние три дня.
2 ответа
Ни один из конструкторов не найден с
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
не зарегистрировано
Ты пробовал это:
// Register types that expose interfaces...
builder.RegisterType<BaseService<ChargeOptions>>.As(typeof(IBaseService<ChargeOptions>));
В противном случае измените код ChargeOptionsService. Дайте ему конструктор по умолчанию. посмотрите, работает ли это, заново добавьте аргумент constrcutor один за другим и посмотрите, где он идет не так.