Автоматическая фабрика с Common.Logging и Autofac? - PullRequest
10 голосов
/ 21 июля 2009

Я хотел бы внедрить ILog в мои классы, а не ILoggerFactoryAdapter, но ILoggerFactoryAdapter необходимо имя вызывающего класса (класс, который хочет что-то регистрировать, чтобы я мог быть должным образом классифицирован), чтобы Autofac мог как-то идентифицировать класс которые запрашивают ILog и автоматически создают ILog с завода?

Ответы [ 2 ]

9 голосов
/ 05 сентября 2009

Бэйли Лин разработал отличный подход, который не использует стековую прогулку - см. Пост здесь: http://groups.google.com/group/autofac/msg/704f926779cbe8b3

5 голосов
/ 22 июля 2009

Я тоже пытался это сделать, но не смог найти способ получить доступ к стеку активации автофака (без его исправления), чтобы получить тип, который должен быть введен с помощью экземпляра регистратора.

Ниже приведен сертифицированный способ «Работает на моей машине» (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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...