我们有一个带有 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/