使用依赖注入的类似单例的行为

本文关键字:单例 依赖 注入 | 更新日期: 2023-09-27 18:37:16

在对MEF进行了一些研究之后,我遇到了CreationPolicy.Shared 属性,根据MSDN:

指定关联的单个共享实例 ComposablePart 将由 CompositionContainer 创建并共享 由所有请求者。

听起来不错,只要我始终确保只有一个容器访问我使用此策略导出的类。那么,如何确保只有一个容器访问我的导出类型呢?这是我的方案:

我有一个 Windows 服务,需要利用类似单例的类来获取一些内存中数据。数据是非持久性的,因此我希望每当服务启动时都会重新创建它,但一旦服务停止,它就没有任何用处。我的服务中的多个线程需要以线程安全的方式读取和写入此对象,因此我最初的计划是从 ConcurrentDictionary 继承以确保针对它的线程安全操作。

将进入此类的线程都继承自单个抽象基类,那么有没有办法让这个类(并且只有这个类)从 MEF 导入它并按照我想要的方式工作?

感谢您的任何提示,我对 MEF 很陌生,所以我仍在学习来龙去脉

使用依赖注入的类似单例的行为

如果它绝对必须是不同容器中的单例,则可以使用私有构造函数并公开静态Instance属性,就好像它是"经典"非容器管理的单例一样。然后在组合根中,使用 ComposeExportedValue 将其注册到容器:

container.ComposeExportedValue(MySingleton.Instance);

您始终可以使用 Lazy 类型,因为它会阻止其他线程,如以下博客文章中所述:http://geekswithblogs.net/BlackRabbitCoder/archive/2010/05/19/c-system.lazylttgt-and-the-singleton-design-pattern.aspx