如何在C#中将依赖项注入静态类

时间:2018-09-14 05:25:51

标签: c# dependency-injection

我一直在用DI制作简单的记录器类,但是我有一些问题。

有问题。如果我使用DI进行记录器课程。每当我使用它时,都应该这样使用。

var logger = new LogService(new FileLogger());
logger.WriteLine("message");

我想使其成为静态类,但是无法通过构造函数在静态类中注入依赖项。

所以,我这样更改它。

public static class LogService()
{
    private static readonly ILoggable _logger;
    static LogService()
    {
         _logger = new FileLogger();
    }
}

我觉得这很奇怪。这不是DI ..

没有一种将依赖项注入静态类的好方法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

下面是一个使用log4net扩展名向Unity DI容器注入UnityLog4NetResolver记录器的示例:

public class A
{
    readonly ILog log;

    public A(ILog log)
    {
        this.log = log;
    }

    ...
}

...

var container = new UnityContainer();

container
    .AddNewExtension<UnityLog4NetResolver.LogByTypeResolverExtension>();

container.Resolve<A>();

最后一条语句等效于new A(LogManager.GetLogger(typeof(A)))。因此,每个类都可以有一个由DI容器注入相应名称的记录器。

这个想法来自this package。但是,它似乎已被放弃并且不支持最新的Unity版本。