dependency-injection - 具有依赖注入(inject)的单例类 C#

标签 dependency-injection singleton unity-container

我们有一个带有 QCServiceLog 类的外部项目,该类具有由 Unity 解析的 ILogging 依赖项。 但是 QCServiceLog 是一个 Singleton 类,您可以在以下示例中看到:

private readonly ILogging _logging = null;

private static QCServiceLog _instance = null;
public static QCServiceLog Instance
{
    get
    {
        return _instance;
    }
}

public QCServiceLog(ILogging logging)
{
    _logging = logging;
    if (_instance == null)
    {
        _instance = this;
    }
}

我们正在尝试使用它,在我们的解决方案中,我们进行了如下注册:

uc.RegisterType<ILogging, QCFileManager>(new ContainerControlledLifetimeManager());

但由于 QCServiceLog 是一个单例,我们相信代码永远不会通过构造函数,因此 _instance 永远不会被实例化。 我们正在使用它这样做:

QCServiceLog.Instance.Log(ex);

单例是否正确实现?我们相信它永远不会做 QCServiceLog 的

你怎么看?在不更改外部项目的情况下,我们可以做些什么? 您可以想象的异常是:

对象引用未设置为对象的实例。

非常感谢您的帮助!

最佳答案

您提供的代码不是线程安全的 - 在这里查看 Implementing the Singleton Pattern in C# :

public QCServiceLog(ILogging logging)
{
    _logging = logging;
    if (_instance == null)
    {
        _instance = this;
    }
}

另一个问题是构造函数没有被隐藏。因此,即使您的 IoC 容器将类注册为单例,仍然可以使用 new 运算符在代码中的任何位置构造此类的实例。我在我工作的应用程序中发现了内存泄漏,这是由这件事引起的(目的是通过 DI/IoC 使用,它被注册为单例,但通过代码手动更新。

关于dependency-injection - 具有依赖注入(inject)的单例类 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42399088/

相关文章:

javascript - angular - 为模块提供不同的服务

c# - 添加 Claims Transformer 后注入(inject)的 IPrincipal Claims 为空

c# - 在没有 BuildServiceProvider() 的情况下在 AddOpenIdConnect 中获取 ServiceProvider

asp.net-mvc-3 - 是否推荐这种构造函数注入(inject)?

java - 如果在经典单例模式(如果有的话)中使用最终实例有什么好处呢?

java - 实现基于枚举的单例

c# - 奇怪的系统.__佳能异常(exception)

c# - 在 Unity 中的类型之间共享生命周期管理器?

asp.net-mvc-2 - 使用Unity IoC的MVC2- Controller 如何解析?

c# - Unity 和 Container.Resolve