C# 有没有一种不用在构造函数中调用ILog而使用Unity解析log4net的方法?

C# 有没有一种不用在构造函数中调用ILog而使用Unity解析log4net的方法?,c#,asp.net-web-api,unity-container,log4net,C#,Asp.net Web Api,Unity Container,Log4net,因此,我通常(使用DI)的方法是将扩展添加到我的容器中: unityContainer.AddNewExtension<Log4NetExtension>(); 现在我的问题是,在我的一个类中,我不想向构造函数传递任何东西,我想知道如何分配我的记录器(因为我使用unity,我想调用resolve,但它不起作用) 公共类测试 { 私人ILog记录器; 公开考试() { logger=unityContainer.Resolve();//为了简单起见,我编辑了这个 } } 错误是指容

因此,我通常(使用DI)的方法是将扩展添加到我的容器中:

unityContainer.AddNewExtension<Log4NetExtension>();
现在我的问题是,在我的一个类中,我不想向构造函数传递任何东西,我想知道如何分配我的记录器(因为我使用unity,我想调用resolve,但它不起作用)

公共类测试
{
私人ILog记录器;
公开考试()
{
logger=unityContainer.Resolve();//为了简单起见,我编辑了这个
}
}
错误是指容器不知道如何解析ILog

编辑:

不允许我通过其构造函数传递任何内容的类是一个Job(实现IJob)类,最后我使用了一个作业侦听器,而不是登录每个作业


如果您仍然希望为构造函数传递一些信息,那么一些提示是通过一个实现实现实现的,它应该可以帮助您注入参数。我看到了一个可以添加来帮助您的nuget。

Log4net允许您使用类中的名称创建记录器,无需通过构造函数传递它

将其添加为类成员

私有静态只读log4net.ILog logger=log4net.LogManager.GetLogger(“MyAppLog”)


当然,这不使用您的DIContainer。

您可以使用属性注入:

public class test
{
    [Dependency]
    public ILog Logger { get; set; }

    public test()
    {
    }
}
但有两个缺点:

  • 记录器现在是公共可写属性,因此任何人都可以从技术上使用或覆盖记录器
  • 属性注入是针对可选依赖项的,因此您可能会混淆其他查看该类的人

  • 您是否检查了注册和解决的订单?
    unityContainer
    DIContainer.Container
    引用了unityContainer的同一个实例吗?@stukselbax是的,我不好,我应该提到我的DIContainer有一个容器字段,它是unityContainer,所以它是相同的。
    Log4NetExtension
    看起来怎么样?你能提供再现你的问题的代码吗?Log4NetExtension是Unity的内置扩展,它通常像我的第一个示例(我通过构造函数传递它)中那样工作。确切地说,按照你的方式做肯定会成功,但是我想用DI来做,所以我不会在每堂课上都用同样的东西。啊,谢谢你提到这一点,我会记住的!但就我个人而言,我最终还是没有在那个类中使用记录器。
    public class test
    {
        private ILog logger;
    
        public test()
        {
            logger = unityContainer.Resolve<ILog>(); //I edited this for simplicity
        }
    }
    
    public class test
    {
        [Dependency]
        public ILog Logger { get; set; }
    
        public test()
        {
        }
    }