1

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

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>(它不能用The best overloaded match for ... has some invalid arguments编译)。

一种可能的解决方案: 我想我不必使用构造函数注入,而是使用DependencyResolver.

问题:以前肯定有人遇到过这个问题吗?有可能与构造函数注入有关吗?如果是这样,我该怎么办?

注意:在我正在使用的当前项目中StructureMap对于 MVC4),但我认为这里的工具有点无关紧要。

4

3 回答 3

2

您能否将记录器界面更改为:

interface ILogger<out T> where T : BaseClass
于 2013-10-17T09:53:10.977 回答
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
    }
}

所以你的问题不完全是关于依赖注入。它更多地是关于你的架构。

于 2013-10-17T09:14:48.960 回答
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>将手动解析。

于 2013-10-17T10:09:57.720 回答