Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 带有依赖注入c的单例类#_Dependency Injection_Singleton_Unity Container - Fatal编程技术网

Dependency injection 带有依赖注入c的单例类#

Dependency injection 带有依赖注入c的单例类#,dependency-injection,singleton,unity-container,Dependency Injection,Singleton,Unity Container,我们有一个带有QCServiceLog类的外部项目,该类具有由Unity解决的ILOG依赖项。 但QCServiceLog是一个单例类,如以下示例所示: private readonly ILogging _logging = null; private static QCServiceLog _instance = null; public static QCServiceLog Instance { get { return _instance; }

我们有一个带有QCServiceLog类的外部项目,该类具有由Unity解决的ILOG依赖项。 但QCServiceLog是一个单例类,如以下示例所示:

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

你觉得怎么样?在不改变外部项目的情况下,我们能做些什么? 你可以想象的例外情况是:

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

我非常感谢你的帮助

单例实现是否正确

对。但在获得它的静态实例之前,需要首先从容器中实例化它

换句话说,您不能使用此行:

QCServiceLog.Instance.Log(ex);
直到你第一次打电话:

container.Resolve<QCServiceLog>();
或者,制作一个包含逻辑的包装类,以便在使用通过DI容器注入的包装类之前将其正确连接起来

无论哪种方式,您都应该注意DI主要用于您的应用程序。第三方实用程序不一定以DI友好的方式进行操作,因此您可能需要使用or,以便在应用程序的上下文中使用它们

单例实现是否正确

对。但在获得它的静态实例之前,需要首先从容器中实例化它

换句话说,您不能使用此行:

QCServiceLog.Instance.Log(ex);
直到你第一次打电话:

container.Resolve<QCServiceLog>();
或者,制作一个包含逻辑的包装类,以便在使用通过DI容器注入的包装类之前将其正确连接起来


无论哪种方式,您都应该注意DI主要用于您的应用程序。第三方实用程序不一定以DI友好的方式进行操作,因此您可能需要使用or,以使它们在应用程序的上下文中使用DI友好。

您提供的代码不是线程安全的-请看这里:


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

您提供的代码不是线程安全的-请看这里:

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

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