Lorsque j'essaie de définir un PARAMÈTRE à l'aide de la configuration Xml, j'obtiens l'erreur suivante:
Aucun des constructeurs trouvés avec 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' sur le type 'LM.AM.Core.Services.EmailService' ne peut être invoqué avec les services et paramètres disponibles: Impossible résoudre le paramètre 'System.String testSmtp' du constructeur 'Void .ctor (System.String)'.
Voici les fichiers pertinents:
web.config
<configSections>
<section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration" />
</configSections>
<autofac>
<components>
<component type="LM.AM.Core.Services.EmailService , LM.AM.Core" service="LM.AM.Core.Infrastructure.Services.IEmailService , LM.AM.Core.Infrastructure">
<parameters>
<parameter name="testSmtp" value="abc" />
</parameters>
</component>
</components>
</autofac>
Classe de service
public class EmailService : IEmailService
{
public string _testSmtp;
public EmailService (string testSmtp)
{
_testSmtp = testSmtp;
}
}
Inscription
builder.RegisterType<EmailService>().As<IEmailService>().SingleInstance();
Global.asax
var builder = new ContainerBuilder();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
builder.RegisterModule<Core.ModuleInstaller>();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
AutofacContainer.Container = builder.Build();
var emailSvc = AutofacContainer.Container.Resolve<IEmailService>();
J'ai vérifié que le conteneur connaît le paramètre xml et j'ai suivi le Wiki aussi près que possible, mais pour une raison quelconque, le paramètre ne se résout pas sur le seul constructeur et je reçois l'erreur ci-dessus.
Cela devrait être assez simple pour commencer. Quelqu'un peut-il fournir des suggestions sur ce que je peux essayer de faire fonctionner?
Vous avez récupéré votre EmailService
deux fois.
Une fois dans le web.config et une fois avec
builder.RegisterType<EmailService>().As<IEmailService>().SingleInstance();
Si vous avez la ligne ci-dessus dans le Core.ModuleInstaller
puis il remplacera la configuration web.config. Et parce qu'ici vous n'avez pas spécifié le paramètre Autofac lève une exception.
Donc, pour résoudre ce problème supprimez simplement l'enregistrement EmailService
du Core.ModuleInstaller
module.
Si vous utilisez le Core.ModuleInstaller
plusieurs endroits et vous devez avoir l'enregistrement EmailService
là, vous devez alors changer l'ordre de chargement du module:
var builder = new ContainerBuilder();
builder.RegisterModule<Core.ModuleInstaller>();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
ou dites à Autofac
de ne pas remplacer l'enregistrement de EmailService
s'il existe déjà avec PreserveExistingDefaults
:
builder.RegisterType<EmailService>().As<IEmailService>()
.SingleInstance().PreserveExistingDefaults();
J'avais créé un constructeur là où il n'y en avait pas auparavant et je l'ai rendu privé, donc il y avait un constructeur par défaut donc j'ai eu cette erreur. J'ai dû rendre mon constructeur public.
Après une annulation, mon éditeur VisualStudio connaissait toujours le fichier, mais pas mon code en cours d'exécution. J'ai dû ajouter le fichier au projet (encore).
J'avais ajouté le fichier de classe, mais plus tard, j'ai annulé toutes les modifications (au lieu de certaines) du fichier de projet (après avoir inclus trop de packages). Cela a accidentellement supprimé le fichier du projet (fichier), bien qu'il soit toujours présent sur le disque et toujours ouvert dans mon éditeur VS.
Je n'ai pas eu d'erreurs de compilation, car nous avons un enregistrement générique basé sur le type. Quelque chose comme ça:
var myTypes =
from Assembly in myAssemblies
from type in Assembly.GetTypes()
where ...;
foreach (var myImplementation in myTypes)
{
builder.RegisterGeneric(myImplementation).As(typeof(IMyInterface<>));
}
Évidemment, ce n'est pas une réponse pour l'OP, mais peut-être que quelqu'un avec le même symptôme se retrouve également ici.