依赖注入,继承和泛型

时间:2013-10-17 08:48:42

标签: generics inheritance dependency-injection

我正在使用依赖注入,并遇到了一些我无法弄清楚的事情。我有一个需要通用记录器的基类:

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

问题:以前其他人肯定会遇到过这个问题吗?是否可以使用构造函数注入?如果是这样,我该怎么办?

注意:在当前项目中,我使用StructureMapfor MVC4),但我认为此处的工具稍微无关紧要。

3 个答案:

答案 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>将被手动解析。