Vorrei inserire ILog nelle mie classi, non un ILoggerFactoryAdapter, ma ILoggerFactoryAdapter ha bisogno del nome della classe chiamante (la classe che vuole registrare qualcosa, quindi posso essere categorizzato correttamente) quindi Autofac può in qualche modo identificare la classe che chiedono l'ILog e creano automaticamente ILog dalla fabbrica?Fabbrica automatica con Common.Logging e Autofac?
risposta
Bailey Ling si avvicinò con un grande approccio che non fa uso di pila a piedi - vedi post qui: http://groups.google.com/group/autofac/msg/704f926779cbe8b3
Ho provato a farlo anche io, ma non sono riuscito a trovare un modo per ottenere l'accesso allo stack di attivazione di autofac (senza patching) per ottenere il tipo da iniettare con l'istanza del logger.
di seguito riportate le "Opere sulla mia macchina" modo certificato (Autofac-1.4.3.536)
protected override void Load(ContainerBuilder builder)
{
const string loggerName = "Logger.Name";
builder.
Register((c, p) => LogManager.GetLogger(p.Named<string>(loggerName))).
OnPreparing((c, p) =>
{
var stack = p.Context.GetActivationStack();
var requestingType = "default";
if (stack != null && stack.Length > 1) requestingType = stack[1].Description;
var parameters = new List<Parameter>(p.Parameters) { new NamedParameter(loggerName, requestingType) };
p.Parameters = parameters;
}).
FactoryScoped();
}
static class ContextExtensions
{
public static Autofac.Service[] GetActivationStack(this Autofac.IContext context)
{
const string notSupportedMessage = "GetActivationStack not supported for this context.";
var type = context.GetType();
if (type.FullName != "Autofac.Context") throw new NotSupportedException(notSupportedMessage);
var field = type.GetField("_componentResolutionStack", BindingFlags.Instance | BindingFlags.NonPublic);
if (field == null) throw new NotSupportedException(notSupportedMessage);
var activationStack = field.GetValue(context) as Stack<Autofac.Service>;
if (activationStack == null) throw new NotSupportedException(notSupportedMessage);
return activationStack.ToArray();
}
}
wow, grazie, proverò immediatamente! –
funziona come un incantesimo! Grazie! –
La soluzione di Bailey è ottima, ma non funziona con l'integrazione di WebForms. Le pagine e i controlli utente non sono registrati, quindi il gestore eventi non si attiva mai. C'è un commento sul wiki del sito del progetto Autofac allo stesso effetto (http://code.google.com/p/autofac/wiki/Log4NetIntegration). –
Il codice è un po 'obsoleto, ma per fortuna Autofac lo ha adattato a un esempio formale: http://docs.autofac.org/en/latest/examples/log4net.html – Mugen