Pregunta

Me gustaría inyectar ILOG en mis clases, no una ILoggerFactoryAdapter, pero el ILoggerFactoryAdapter necesita el nombre de la clase de llamada (la clase que quiere registrar algo, así que se puede categorizar correctamente) por lo que puedo Autofac alguna manera de identificar la clase los cuales están solicitando la ILOG y automaticamente crear el ILOG desde la fábrica?

¿Fue útil?

Solución

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

Otros consejos

He tratado de hacer esto también, pero no pude encontrar una manera de obtener acceso a la pila de activación de autofac (sin parchear es) para conseguir al tipo que se va a inyectar con la instancia del registrador.

A continuación se muestra el "funciona 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();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top