8

Keiner der Konstrukteure mit ‚Autofac.Core.Activators.Reflection.DefaultConstructorFinder‘ vom Typ ‚gefunden LMS.Services.Security.EncryptionService 'kann mit den verfügbaren Diensten und Parametern aufgerufen werden: nicht Parameter kann lösen ‚LMS.Models.SecuritySettings Sicherheitseinstell‘ von Konstruktor ‚Void .ctor (LMS.Models.SecuritySettings)‘Autofac Keiner der mit ‚Autofac.Core.Activators.Reflection.DefaultConstructorFinder‘ gefunden Konstrukteurs

Hier sind die Codedateien

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 war früher arbeiten. Aber als ich die EncryptionService Implementierung einführte, erhalte ich den obigen Fehler. ist die andere Implementierung Arbeits Code 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 
} 

Antwort

8

Wenn Autofac versuchen EncryptionService zu lösen sie einen SecuritySettings Dienst zu lösen versucht, aber Autofac nicht bekannt, eine solche Registrierung ist. Um diesen Fehler zu beheben, sollten Sie eine SecuritySettings Implementierung registrieren.

Zum Beispiel:

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

Vielen Dank Cyril Durand. Es funktioniert jetzt. – pbhalchandra

0

Sie können auch Autofac Verhalten arbeiten, wie Sie ursprünglich erwartet [und richten Sie mit den Vorgaben einiger anderer Behälter] einstellen, indem Sie das AnyConcreteTypeNotAlreadyRegisteredSource (the docs for Sources sehen): -

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

Ich habe dieses Schema zusammen mit delegate factories und implicit Relationship Types verwendet, um so ziemlich die explizite Registrierung aus einer Reihe von Apps zu entfernen, aber wie Sie scheinen, den Weg der expliziten gegangen (Boilerpla ty: P) registrierung Ich würde empfehlen zu googeln AnyConcreteTypeNotAlreadyRegisteredSource, um zu sehen, ob ein breiteres Schema passen könnte, was Sie besser suchen.

0

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

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