8

Ни один из конструкторов, найденных с «Autofac.Core.Activators.Reflection.DefaultConstructorFinder» по типу «LMS.Services.Security.EncryptionService 'может быть вызван с помощью имеющихся услуг и параметров: не удается разрешить параметр „LMS.Models.SecuritySettings securitySettings“ конструктора „Пустота .ctor (LMS.Models.SecuritySettings)“Autofac Ни один из конструкторов, найденных с «Autofac.Core.Activators.Reflection.DefaultConstructorFinder»

Ниже приведены кодовые файлы

Класс обслуживания

public class EncryptionService : IEncryptionService 
{ 
    private readonly SecuritySettings _securitySettings; 
    public EncryptionService(SecuritySettings securitySettings) 
    { 
     this._securitySettings = securitySettings; 
    } 
} 

Bootstrapper

private static void SetAutofacContainer() 
{ 
    var builder = new ContainerBuilder(); 
    builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
    builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest(); 
    builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerRequest(); 

    builder.RegisterAssemblyTypes(typeof(CourseRepository).Assembly) 
      .Where(t => t.Name.EndsWith("Repository")) 
      .AsImplementedInterfaces() 
      .InstancePerRequest(); 

    builder.RegisterAssemblyTypes(typeof(CourseService).Assembly) 
      .Where(t => t.Name.EndsWith("Service")) 
      .AsImplementedInterfaces() 
      .InstancePerRequest(); 

    builder.RegisterFilterProvider(); 
    var container = builder.Build(); 
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
} 

Он работал раньше. Но когда я представил реализацию EncryptionService, я получаю ошибку выше. Вот другая рабочая реализация кода следующим образом

public class CourseService : ICourseService 
{ 
    #region Fields 

    private readonly IRepository<Course> _courseRepository; 
    private readonly IUnitOfWork _unitOfWork; 

    #endregion 

    #region ctor 

    public CourseService(IRepository<Course> courseRepository, IUnitOfWork unitOfWork) 
    { 
     _courseRepository = courseRepository; 
     _unitOfWork = unitOfWork; 
    } 
    #endregion 
} 

ответ

8

Когда Autofac попытаться решить EncryptionService он пытается решить SecuritySettings услугу, но Autofac не знает о такой регистрации.

Для решения этой проблемы необходимо зарегистрировать реализацию SecuritySettings.

Например:

builder.RegisterType<SecuritySettings>() 
     .As<SecuritySettings>(); 
+0

Большое спасибо Кирилл Дюран. Он работает сейчас. – pbhalchandra

0

Вы также можете настроить поведение Autofac, чтобы работать, как вы первоначально предполагалось [и выравнивания с параметрами по умолчанию некоторых других контейнеров], добавив AnyConcreteTypeNotAlreadyRegisteredSource (см the docs for Sources): -

var builder = new ContainerBuilder(); 
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); 

Я использовал эту схему вместе с delegate factories и implicit Relationship Types, чтобы в значительной степени удалить явную регистрацию из набора приложений, но, как вы, кажется, пошли по пути явного (b oilerplaty: P) Регистрация Я бы порекомендовал googling AnyConcreteTypeNotAlreadyRegisteredSource, чтобы узнать, подходит ли более широкая схема тем, что вы ищете лучше.

0

В моем случае я не зарегистрировал контекст. Я зарегистрировал контекст, и это сработало для меня

builder.RegisterType<JComDbEntities>().AsSelf().As<DbContext>().InstancePerLifetimeScope(); 
Смежные вопросы