Автоматическая фабрика с Общим. Logging и Autofac?

Около вышеупомянутых хороших аргументов я добавлю, что партия людей сегодня видит switch как устаревший остаток от процедурного прошлого Java (назад ко временам C).

я не полностью совместно использую это мнение, я думаю switch, может иметь его полноценность в некоторых случаях, по крайней мере, из-за его скорости, и так или иначе это лучше, чем некоторый ряд расположения каскадом числового else if, я видел в некотором коде...

, Но действительно, стоит посмотреть на случай, где Вы нуждаетесь в переключателе и видите, не может ли это быть заменено чем-то больше OO. Например, перечисления в Java 1.5 +, возможно, HashTable или некоторый другой набор (когда-то я сожалею, что у нас нет (анонимных) функций как у гражданина первого класса, как в Lua —, который не имеет переключателя — или JavaScript), или даже полиморфизм.

10
задан Carl Hörberg 21 July 2009 в 14:22
поделиться

2 ответа

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

9
ответ дан 3 December 2019 в 23:14
поделиться

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

Ниже приведен сертифицированный способ "Работает на моей машине" (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();
    }
}
5
ответ дан 3 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: