Dependency injection 带有依赖注入c的单例类#
我们有一个带有QCServiceLog类的外部项目,该类具有由Unity解决的ILOG依赖项。 但QCServiceLog是一个单例类,如以下示例所示: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; }
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;
}
}