【问题标题】:Automatic factory with Common.Logging and Autofac?使用 Common.Logging 和 Autofac 的自动化工厂?
【发布时间】:2009-07-21 13:34:16
【问题描述】:

我想将 ILog 注入到我的类中,而不是 ILoggerFactoryAdapter,但 ILoggerFactoryAdapter 需要调用类的名称(想要记录某些内容的类,因此我可以正确分类)所以 Autofac 可以以某种方式识别该类哪些请求 ILog 并从工厂自动创建 ILog?

【问题讨论】:

    标签: logging dependency-injection autofac


    【解决方案1】:

    Bailey Ling 提出了一个不使用堆栈遍历的好方法 - 请参阅此处的帖子:http://groups.google.com/group/autofac/msg/704f926779cbe8b3

    【讨论】:

    【解决方案2】:

    我也尝试过这样做,但我找不到一种方法来访问 autofac 的激活堆栈(不打补丁)以获取要注入记录器实例的类型。

    以下是“Works On My Machine”认证方式(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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 2015-06-20
      相关资源
      最近更新 更多