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