Using LogManager.GetLogger with Unity

后端 未结 3 1627
时光说笑
时光说笑 2021-02-06 13:22

Given this class:

class Foo
{
    readonly ILog log;

    public Foo(ILog log)
    {
        this.log = log;
    } 

    ...
}

I\'d like to con

3条回答
  •  梦如初夏
    2021-02-06 14:00

    If you want a DI container to return you a logger based on the class’ type information, then put the type information into the public interface so the DI container can see it. It removes the need for any container specific override features and then it won’t matter if you are using Unity or AutoFac.

    Someone that knows the log4net object model well might be able to give you a more efficient implementation, but try something like this:

    using System;
    using Microsoft.Practices.Unity;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace UnityLoging
    {
        public interface ILog : log4net.ILog
        { }
    
        public class MyLogger : log4net.Core.LogImpl, ILog
        {
            public MyLogger() : base(log4net.LogManager.GetLogger(typeof(T).Name).Logger)
            { }
        }
    
        public class ClassToLog
        {
            private readonly log4net.ILog log;
    
            public ClassToLog(ILog log)
            {
                this.log = log;
            }
    
            public void LogMe()
            {
                log.Debug("Got here");
            }
        }
    
        [TestClass]
        public class TestClass
        {
            [TestMethod]
            public void GenericLogRegistrationTest()
            {
                log4net.Config.XmlConfigurator.Configure();
                IUnityContainer container = new UnityContainer();
                container.RegisterType(typeof(ILog<>), typeof(MyLogger<>));
    
                ClassToLog c = container.Resolve();
                c.LogMe();
    
                log4net.LogManager.Shutdown();
            }
        }
    }
    

提交回复
热议问题