webentwicklung-frage-antwort-db.com.de

Autofac Keiner der Konstruktoren gefunden mit 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'

Keiner der Konstruktoren, die mit 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' vom Typ 'LMS.Services.Security.EncryptionService' gefunden wurden, kann mit den verfügbaren Services und Parametern aufgerufen werden: Parameter 'LMS.Models.SecuritySettings securitySettings' des Konstruktors 'Void .ctor (LMS.Models.SecuritySettings)' kann nicht aufgelöst werden

Hier sind die Code-Dateien

Serviceklasse

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

Es hat früher funktioniert. Aber als ich die Implementierung von EncryptionService eingeführt habe, erhalte ich den obigen Fehler .. Hier ist die andere Implementierung des Arbeitscodes wie folgt

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

Wenn Autofac versucht, EncryptionService aufzulösen, wird versucht, einen SecuritySettings-Dienst aufzulösen, aber Autofac kennt keine solche Registrierung. 

Um diesen Fehler zu beheben, sollten Sie eine SecuritySettings-Implementierung registrieren. 

Zum Beispiel : 

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

Sie können das Verhalten von Autofac auch so anpassen, dass es so funktioniert, wie Sie es ursprünglich erwartet hatten [und sich an den Standardwerten einiger anderer Container orientieren], indem Sie die Variable AnyConcreteTypeNotAlreadyRegisteredSource hinzufügen (siehe die Dokumente für Quellen ): -

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

Ich habe dieses Schema zusammen mit delegate factories und implicit Relationship Types verwendet, um die explizite Registrierung aus einer Suite von Apps zu entfernen, aber da Sie die explizite (boilerplaty: P) -Registrierung eingeschlagen haben Ich würde empfehlen, AnyConcreteTypeNotAlreadyRegisteredSource zu googeln, um zu sehen, ob ein breiteres Schema besser zu dem passt, was Sie suchen.

2
Ruben Bartelink

in meinem Fall habe ich den Kontext nicht registriert. Ich habe den Kontext registriert und es hat für mich funktioniert 

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