8

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

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

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

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

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

感谢您提供的任何提示,我对 MEF 很陌生,所以我仍在学习细节

4

2 回答 2

1

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

container.ComposeExportedValue(MySingleton.Instance);
于 2012-06-15T19:30:52.923 回答
0

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

于 2012-06-15T19:47:46.790 回答