我正在使用依赖注入,并遇到了一些我无法弄清楚的事情。我有一个需要通用记录器的基类:
public class BaseClass
{
public BaseClass(ILogger<BaseClass> logger)
{
// code here
}
}
然后我有一个继承的类,它还需要通用记录器:
public class SubClass : BaseClass
{
public SubClass(ILogger<SubClass> logger)
{
// code here
}
}
问题是这不会与消息一起编译; BaseClass不包含带0参数的构造函数。
如果我能做到这一点,这很容易解决:
public SubClass(ILogger<SubClass> logger) : base(logger)
问题是这不合法,因为ILogger<SubClass>
不是ILogger<BaseClass>
的实例(它不能用编译。最好的重载匹配...有一些无效的参数< / em>的)。
一种可能的解决方案:
我想我不必使用构造函数注入,而是使用DependencyResolver
。
问题:以前其他人肯定会遇到过这个问题吗?是否可以使用构造函数注入?如果是这样,我该怎么办?
注意:在当前项目中,我使用StructureMap
(for MVC4),但我认为此处的工具稍微无关紧要。
答案 0 :(得分:2)
您可以将记录器界面更改为:
interface ILogger<out T> where T : BaseClass
答案 1 :(得分:1)
这是因为ILogger<SubClass>
不是ILogger<BaseClass>
的子类,所以编译器认为你编写了一个新的构造函数。如果你写了
public class SubClass : BaseClass
{
public SubClass(ILogger<SubClass> logger)
: base() // since base class does not have a constructor
// with no arguments, you will get the error
{
// code here
}
}
所以你的问题不是完全依赖于依赖注入。它更多地是关于您的架构。
答案 2 :(得分:1)
您可以在BaseClass
中添加无参数构造函数,该构造函数将调用参数化构造函数并将其传递给手动解析的ILogger
实例。像这样:
public BaseClass()
: this(ResolveLogger())
{
}
private static ILogger<BaseClass> ResolveLogger()
{
// resolve the instance manually and return it
}
这样,如果解析了类型BaseClass
的实例,它将使用参数化构造函数并注入已解析的ILogger<BaseClass>
实例。但是,如果派生类被解析,则此派生类将调用无参数BaseClass()
构造函数,并且ILogger<BaseClass>
将被手动解析。