首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Unity2.0注入Log4Net ILog实现

如何使用Unity2.0注入Log4Net ILog实现
EN

Stack Overflow用户
提问于 2011-07-27 22:46:08
回答 6查看 29.8K关注 0票数 21

归根结底,这与设置log4Net有关,但通常问题不是特定于日志。

一般来说,我试图弄清楚的是,在Microsoft Unity2.0中,如何做一些与Castle.Facilities.Logging.LoggingFacility相当的事情。也就是说,能够声明对记录器的依赖关系,并使用被注入的对象的类型对记录器进行初始化。

本着测试胜过千言万语的精神,以下是我所需要的:

代码语言:javascript
复制
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;
    }
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-07-28 11:48:30

我不知道这是否是你想要的,但我几个月前看到了它,当我看到你的问题时,我想起了它。我还没有用过Unity,所以我真的不能将你发布的内容与链接中的内容进行比较。希望它能对你有所帮助:

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

票数 15
EN

Stack Overflow用户

发布于 2012-12-29 02:13:22

我一直在努力实现相同的结果,即能够使用Unity的构造函数注入将正确配置的ILog实例插入到依赖项中。

最后,我编写了自己的"log4net“unity扩展来实现这一点(部分灵感来自于另一位回答者Kenneth Baltrinic写的一篇博客文章)。

这允许您在Unity中注册一次分机:

代码语言:javascript
复制
var container = new UnityContainer();
container.AddNewExtension<Log4NetExtension>();

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

代码语言:javascript
复制
public class MyClass
{
    private readonly ILog logger;

    public MyClass(ILog logger)
    {
        this.logger = logger;
    }
}

可以在以下位置找到该扩展:

https://github.com/roblevine/UnityLoggingExtensions

更多信息请点击此处:http://blog.roblevine.co.uk/net/using-log4net-with-unity/

编辑现在以NuGet package的形式提供

票数 9
EN

Stack Overflow用户

发布于 2011-07-28 01:14:43

在深入研究Unity源代码几个小时后,我想出了以下解决方案。然而,我更喜欢找到一种方法来根据被解析的类型来设置适当的依赖解析器,而不是覆盖默认的构造函数选择器策略。其一,因为我之前出于其他目的重写了默认的构造函数选择器。另一方面,这个解决方案只处理通过构造函数注入的依赖项。为了实现完整的复盖范围,我认为还必须覆盖默认的属性和方法选择器。对于我自己来说,我只需要构造函数。

代码语言:javascript
复制
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();
        container.AddNewExtension<LoggingExtension>();
        container.RegisterType<LoggerUser>(new ContainerControlledLifetimeManager());
        var user = container.Resolve<LoggerUser>();

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

class LoggingExtension : UnityContainerExtension
{
    protected override void Initialize()
    {
        Context.Policies.SetDefault(typeof(IConstructorSelectorPolicy), new LoggingConstructorSelectorPolicy()); 
    }
}

public class LoggingConstructorSelectorPolicy : DefaultUnityConstructorSelectorPolicy
{
    protected override IDependencyResolverPolicy CreateResolver(ParameterInfo parameter)
    {
        return parameter.ParameterType == typeof(ILogger) 
                   ? new LoggerResolverPolicy(parameter.Member.DeclaringType) 
                   : base.CreateResolver(parameter);
    }
}

class LoggerResolverPolicy : IDependencyResolverPolicy
{
    private readonly Type _dependantType;

    public LoggerResolverPolicy(Type dependantType)
    {
        _dependantType = dependantType;
    }

    public object Resolve(IBuilderContext context)
    {
        return new Logger(_dependantType);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6846342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档