如何使用Unity 2.0注入Log4Net ILog实现

Ken*_*nic 20 c# log4net dependency-injection castle-windsor unity-container

最终这与设置log4Net有关,但一般来说问题不是特定于日志记录.

一般来说,我想弄清楚的是在Microsoft Unity 2.0中,如何做到与Castle.Facilities.Logging.LoggingFacility相同的东西.即能够声明对记录器的依赖性并使用其注入的对象的Type初始化记录器.

本着考试的精神值得千言万语,这就是我所需要的:

class Logger_IOC_Tests
{
    //[Test] 
    public void Logger_should_be_initialized_with_the_type_of_the_object_that_is_using_it()
    {
        var container = new UnityContainer();
        /* Configuration Magic probably involiving registering either 
            * a custom IDependencyResolverPolicy or BuilderStrategy
            * goes here...
            */
        container.RegisterType<LoggerUser>(new ContainerControlledLifetimeManager());

        var user = container.Resolve<LoggerUser>();

        Assert.True(user.Logger.GetUserType() == user.GetType());
    }
}

interface ILogger
{
    Type GetUserType();
}

class Logger : ILogger
{
    private readonly Type _type;

    public Logger(Type type)
    {
        _type = type;
    }

    public Type GetUserType()
    {
        return _type;
    }
}

class LoggerUser
{
    public readonly ILogger Logger;

    public LoggerUser(ILogger logger)
    {
        Logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

wag*_*ghe 15

我不知道你是否正在寻找这个,但几个月前我就看到它了,当我看到你的问题时,它被提醒了.我没有使用Unity,所以我无法真正比​​较你发布的内容和链接中的内容.希望它对您有用:

http://davidkeaveny.blogspot.com/2011/03/unity-and-log4net.html


Rob*_*ine 9

我一直在努力实现与ILog使用Unity构造函数注入将正确配置的实例插入依赖项相同的结果.

最后,我编写了自己的"log4net"统一扩展来完成这一点(部分灵感来自另一位回答者Kenneth Baltrinic编写的博客文章).

这允许您使用Unity注册一次扩展:

var container = new UnityContainer();
container.AddNewExtension<Log4NetExtension>();
Run Code Online (Sandbox Code Playgroud)

然后传入正确的ILog记录器实例:

public class MyClass
{
    private readonly ILog logger;

    public MyClass(ILog logger)
    {
        this.logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

扩展可以在这里找到:

https://github.com/roblevine/UnityLoggingExtensions

更多信息:http://blog.roblevine.co.uk/net/using-log4net-with-unity/

编辑现在可以作为NuGet包使用