2011-03-21 13 views
13

Ho la seguente registrazioneautofac problema di registrazione nel rilascio v2.4.5.724

builder.Register<Func<Type, IRequestHandler>>(
      c => request => (IRequestHandler)c.Resolve(request)); 

Fondamentalmente sto cercando di registrare un metodo factory che risolve un caso di IRequestHandler da un determinato tipo.

Questo funziona fino alla versione 2.4.3.700. Ma ora sto ottenendo il seguente errore ..

Impossibile accedere a un oggetto disposto. Nome oggetto: 'Questa operazione di risoluzione è già terminata. Quando si registra utilizzando lambdas, il parametro 'c' IComponentContext su , il lambda non può essere memorizzato. Invece, risolve IComponentContext di nuovo da "c", o risolve un Func <> basato su factory per creare i successivi componenti da. '.

UPDATE

stavo cercando di limitare l'esposizione di autofac per il resto dei progetti nella soluzione. Nick, grazie per il suggerimento, ora la mia registrazione assomiglia a questo ...

builder.Register<Func<Type,IRequestHandler>>(c => 
     { 
      var handlers = c.Resolve<IIndex<Type,RequestHandler>>(); 
      return request => handlers[request]; 
     }); 

risposta

20

Il c in questa espressione è una temporanea, in modo tale codice, mentre in precedenza funzionale, è rotto. Autofac 2.4.5 rileva questo problema mentre le versioni precedenti lo ignoravano silenziosamente.

Per risolvere il problema, in modo esplicito risolvere IComponentContext:

builder.Register<Func<Type, IRequestHandler>>(c => { 
    var ctx = c.Resolve<IComponentContext>(); 
    return request => (IRequestHandler)ctx.Resolve(request)); 
}); 

La funzionalità si sta emulando qui potrebbe essere rappresentata meglio utilizzando le chiavi e gli indici, per esempio vedi Interrupted chain of IoC o http://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices.

0

Ho avuto un problema simile a quello dell'utente 6130. Volevo evitare l'uso di IIndex nella mia implementazione di classe e passare invece un resolver di servizio nel mio costruttore.

Così ora ho la mia implementazione del servizio con il seguente costruttore:

public MvcMailer(Converter<string, MailerBase> mailerResolver) 
{ 
    _resolver = mailerResolver; 
} 

ho voluto utilizzare servizi calettati direttamente senza fare affidamento sul namespace Autofac. Stavo ottenendo lo stesso errore fino a quando ho ristrutturato la configurazione in quanto tale.

1) eseguire la scansione di tutti i miei implementazioni mailer e indice tramite nome della classe (che potrebbe essere migliorata)

builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly()) 
     .Where(t => t.Name.EndsWith("Mailer")).Keyed<Mvc.Mailer.MailerBase>(t => t.Name.Replace("Mailer", "").ToLower()); 

2) Registrare il convertitore in Autofac config

builder.Register<System.Converter<string,Mvc.Mailer.MailerBase>>(c => { 
    var all = c.Resolve<Autofac.Features.Indexed.IIndex<string,Mvc.Mailer.MailerBase>>(); 
     return delegate(string key) 
     { 
       return all[key]; 
     }; 
    }); 

3) Registrati come altri tipi di componenti e lascia che Autofac gestisca l'iniezione del convertitore

builder.RegisterType<Mailers.MvcMailer>().As<Mailers.IMailer>(); 

Problemi correlati