【问题标题】:Singleton-like behavior with Dependency Injection依赖注入的类似单例的行为
【发布时间】:2012-06-15 18:15:59
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我使用 NInject 和它的“as singleton”模式来实现很好的绑定。请注意保持 MEF 提供的线程安全(无状态或有趣的副作用)。
  • @jonnyGold 谢谢,我之前没有使用过 Ninject...它是搭载在 MEF 上还是它自己独特的 DI 框架?
  • 它是它自己的框架。您可以通过 nuget 获取它,并且有针对 MVC 和 WCF 的专业化。我最喜欢的一点是绑定是在代码中声明的,因此您不会犯类型匹配错误。或者一个错字,就此而言。此外,上下文绑定非常强大。

标签: c# multithreading dependency-injection mef extensibility


【解决方案1】:

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

container.ComposeExportedValue(MySingleton.Instance);

【讨论】:

  • 不完全是,如果可能的话,我只想将它公开给单个容器,MEF 框架将确保它默认为单例。但是,如果这是不可能的,那么我认为首先使用 MEF 没有任何优势
  • 我不确定我是否完全理解您的要求。您应该确保只存在一个容器。然后CreationPolicy.Shared 将产生一个单例。您是否正在考虑创建多个容器?因为那将是非典型的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多