Me gustaría inyectar ILog en mis clases, no en ILoggerFactoryAdapter, pero el ILoggerFactoryAdapter necesita el nombre de la clase que llama (la clase que quiere registrar algo, para poder categorizarlo correctamente), así puede Autofac identificar de alguna manera la clase que están solicitando el ILog y crean automáticamente el ILog de fábrica?Fábrica automática con Common.Logging y Autofac?
Respuesta
Bailey Ling se acercó con un gran acercamiento que no utiliza la pila caminar - ver post aquí: http://groups.google.com/group/autofac/msg/704f926779cbe8b3
He intentado hacer esto también, pero no pude encontrar una manera de obtener acceso a la pila de activación de autofac (sin parches) para obtener el tipo que se va a inyectar con la instancia del registrador.
a continuación es el "Obras en mi máquina" forma certificada (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, gracias, lo probaré inmediatamente! –
funciona como el encanto! ¡Gracias! –
- 1. Common.Logging con varios adaptadores de fábrica
- 2. ¿Puede Autofac hacer autoaglomeración automática?
- 3. Cómo inyectar una fábrica de tipos genéricos con Autofac
- 4. Common.Logging excepción config
- 5. Autofac y Quartz.Net Integración
- 6. Autofac - Lifetime y módulos
- 7. Autofac y IDisposable interfaz
- 8. Gestionando múltiples bases de datos con NHibernate y Autofac
- 9. Flyweight y problema de fábrica con IDisposable
- 10. General NHibernate ISession con Autofac
- 11. Módulos Autofac con sus propias dependencias
- 12. autofac en la liberación v2.4.5.724
- 13. Autofac y API web ASP.NET ApiController
- 14. diferencia Autofac entre el Registro y RegisterType
- 15. ¿Ninject es compatible con Func (fábrica generada automáticamente)?
- 16. Registro en tiempo de ejecución con Autofac
- 17. Integración Autofac MVC con ASP.Net MVC 4
- 18. Resolución de la interfaz genérica con Autofac
- 19. Uso de Autofac con eventos de dominio
- 20. Autofac paso de parámetros y autowiring
- 21. ¿Cómo manejar referencias circulares con Autofac 2.4.5?
- 22. Patrones de fábrica y estrategia
- 23. ASP.NET MVC 3, RavenDB, y Autofac Issue Plus 2 Otras preguntas de Autofac
- 24. Caliburn.Micro. llamar automáticamente eventaggregator.Subscribe() para los implementadores iHandle con Autofac
- 25. ¿Error de fábrica duplicado con rspec y factory girl?
- 26. Realizando pruebas unitarias con dependencias anidadas y clases de fábrica
- 27. Inyección de propiedad Autofac
- 28. FluentValidation Autofac ValidatorFactory
- 29. Método de fábrica VS Objeto de fábrica
- 30. AutoFac: ¿Qué hace PropertyWiringFlags.AllowCircularDependencies?
La solución de Bailey es excelente, pero no funciona con la integración de WebForms. Las páginas y los controles de usuario no están registrados, por lo que el controlador de eventos nunca se dispara. Hay un comentario en el wiki del sitio del proyecto Autofac con el mismo efecto (http://code.google.com/p/autofac/wiki/Log4NetIntegration). –
El código está un poco desactualizado, pero afortunadamente Autofac lo adaptó a un ejemplo formal: http://docs.autofac.org/en/latest/examples/log4net.html – Mugen