2013-04-15 12 views
20

Quando si tenta di impostare un parametro utilizzando la configurazione XML ottengo il seguente errore:Nessuno dei costruttori trovato con 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'

None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'LM.AM.Core.Services.EmailService' can be invoked with the available services and parameters: Cannot resolve parameter 'System.String testSmtp' of constructor 'Void .ctor(System.String)'.

Qui ci sono i file in questione:

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> 

Service Class

public class EmailService : IEmailService 
{ 
    public string _testSmtp; 

    public EmailService (string testSmtp) 
    { 
     _testSmtp = testSmtp; 
    } 
} 

Registrazione

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

Ho controllato il contenitore è a conoscenza del parametro xml e ho seguito il wiki più vicino come posso, ma per qualche motivo il parametro non si sta risolvendo sull'unico costruttore e sto ricevendo l'er sopra ror.

Questo dovrebbe essere abbastanza semplice per iniziare. Qualcuno può fornire qualche suggerimento su cosa posso provare a fare funzionare questo ?

risposta

16

Hai rinviato il tuo EmailServicedue volte.

volta nel web.config e una volta con

builder.RegisterType<EmailService>().As<IEmailService>().SingleInstance(); 

Se avete la linea di sopra nella Core.ModuleInstaller allora avrà la precedenza la configurazione web.config. E poiché qui non è stato specificato il parametro Autofac genera un'eccezione.

Quindi, per risolvere questo è sufficiente rimuovere la EmailService registrazione dal modulo Core.ModuleInstaller.

Se si utilizzano le Core.ModuleInstaller molteplici luoghi e avete bisogno di avere la registrazione EmailService lì allora avete bisogno di cambiare l'ordine del caricamento del modulo:

var builder = new ContainerBuilder(); 
builder.RegisterModule<Core.ModuleInstaller>(); 
builder.RegisterModule(new ConfigurationSettingsReader("autofac")); 

o dire Autofac di non ignorare la registrazione di EmailService se esiste già con PreserveExistingDefaults:

builder.RegisterType<EmailService>().As<IEmailService>() 
     .SingleInstance().PreserveExistingDefaults(); 
6

avevo creato un costruttore dove prima non c'era e ne ha fatto privato, quindi non era defaul t costruttore quindi ho ricevuto questo errore. Dovevo rendere pubblico il mio costruttore.

+2

Ohh Dio hai salutato la mia vita! – Cleiton

Problemi correlati