C# 有没有一种不用在构造函数中调用ILog而使用Unity解析log4net的方法?
因此,我通常(使用DI)的方法是将扩展添加到我的容器中: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();//为了简单起见,我编辑了这个 } } 错误是指容
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()
{
}
}