web-dev-qa-db-fra.com

Autofac Aucun des constructeurs trouvés avec 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'

Aucun des constructeurs trouvés avec 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' sur le type 'LMS.Services.Security.EncryptionService' ne peut être appelé avec les services et paramètres disponibles: Impossible de résoudre le paramètre 'LMS.Models.SecuritySettings securitySettings' du constructeur 'Void .ctor (LMS.Models.SecuritySettings)'

Voici les fichiers de code

Classe de service

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

Cela fonctionnait plus tôt. Mais quand j'ai introduit l'implémentation EncryptionService, je reçois l'erreur ci-dessus . Voici l'autre implémentation de code de travail comme suit

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
}
15
pbhalchandra

Lorsque Autofac essayez de résoudre EncryptionService, il tente de résoudre un service SecuritySettings mais Autofac n'a pas connaissance d'un tel enregistrement. 

Pour résoudre cette erreur, vous devez enregistrer une implémentation SecuritySettings

Par exemple : 

builder.RegisterType<SecuritySettings>()
       .As<SecuritySettings>(); 
14
Cyril Durand

Vous pouvez également ajuster le comportement d'Autofac pour qu'il fonctionne comme vous l'aviez initialement prévu [et vous aligner sur les valeurs par défaut de certains autres conteneurs] en ajoutant la variable AnyConcreteTypeNotAlreadyRegisteredSource (voir les docs pour les sources ): -

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

J'ai utilisé ce schéma avec déléguer des usines et des types de relation implicites pour supprimer à peu près l'enregistrement explicite d'une suite d'applications, mais comme vous semblez avoir suivi la voie de l'enregistrement explicite (boilerplaty: P) Je recommanderais googler AnyConcreteTypeNotAlreadyRegisteredSource pour voir si un programme plus vaste pourrait convenir à ce que vous recherchez.

2
Ruben Bartelink

dans mon cas, je n'ai pas enregistré le contexte. J'ai enregistré le contexte et cela a fonctionné pour moi 

builder.RegisterType<JComDbEntities>().AsSelf().As<DbContext>().InstancePerLifetimeScope();
1
Pranav Mishra