2009-07-21 10 views
9

मैं अपने वर्गों में आईएलओजी इंजेक्ट करना चाहता हूं, न कि ILoggerFactoryAdapter, लेकिन ILoggerFactoryAdapter को कॉलिंग क्लास (कक्षा जो कुछ लॉग करना चाहता है, के नाम की आवश्यकता है, इसलिए मुझे ठीक से वर्गीकृत किया जा सकता है) ताकि ऑटोफैक किसी भी तरह कक्षा की पहचान कर सके आईएलओजी का अनुरोध कर रहे हैं और कारखाने से स्वचालित रूप से आईएलओजी बना रहे हैं?आम। लॉजिंग और ऑटोफैक के साथ स्वचालित कारखाना?

उत्तर

9

बेली लिंग एक महान दृष्टिकोण है कि ढेर चलने का उपयोग नहीं करता के साथ आया था - पोस्ट यहाँ देखें: http://groups.google.com/group/autofac/msg/704f926779cbe8b3

+0

बेली का समाधान बहुत अच्छा है, लेकिन यह वेबफॉर्म एकीकरण के साथ काम नहीं करता है। पेज और उपयोगकर्ता नियंत्रण पंजीकृत नहीं हैं, इसलिए ईवेंट हैंडलर कभी आग नहीं लगाता है। Autofac प्रोजेक्ट साइट की विकी पर एक ही प्रभाव (http://code.google.com/p/autofac/wiki/Log4NetIntegration) पर एक टिप्पणी है। –

+1

कोड थोड़ा पुराना है, लेकिन सौभाग्य से ऑटोफैक ने इसे औपचारिक उदाहरण में अनुकूलित किया: http://docs.autofac.org/en/latest/examples/log4net.html – Mugen

5

मैंने यह भी करने की कोशिश की है, लेकिन मुझे लॉगर इंस्टेंस के साथ इंजेक्शन देने वाले प्रकार को प्राप्त करने के लिए ऑटोफैक (इसे पैच किए बिना) के सक्रियण स्टैक तक पहुंच प्राप्त करने का कोई तरीका नहीं मिला।

नीचे "मेरे मशीन पर काम करता है" प्रमाणित तरीका है (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(); 
    } 
} 
+0

वाह, धन्यवाद, तुरंत इसे आजमाएगा! –

+0

आकर्षण की तरह काम करता है! धन्यवाद! –

संबंधित मुद्दे