web-dev-qa-db-fra.com

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

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?

26
Dion

Vous avez récupéré votre EmailServicedeux 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();
22
nemesv

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.

7
fruitbatinshades

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).

TLDR: Où cela s'est-il mal passé?

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.

0
Yahoo Serious