【问题标题】:MEF and WCF [closed]MEF 和 WCF [关闭]
【发布时间】:2009-06-10 12:44:53
【问题描述】:

我想使用 MEF 来实例化在 IIS 中托管多个 WCF 服务的应用程序中的依赖项。不同的服务依赖于共享组件,我希望 MEF 管理这些组件的实例化和注入。

我应该在哪里进行作曲?最初我想在 IInstanceProvider 中有一个 CompositionContainer,但后来我意识到该容器只能服务于一个端点,并且它管理的实例不会与其他端点共享。同样,在 ServiceHost 中拥有 CompositionContainer - 这不会在不同服务之间共享。

我的分析正确吗?将 CompositionContainer 作为应用程序级别的单例的唯一解决方案是什么?

第二个问题是 - 当 WCF 实例化服务时(例如启动新用户会话时),我如何提供其依赖项?我是否让 CompositionContainer 重新组合?这不会影响其他已经在运行的 Service 实例吗?

有人可以分享这个概念的代码示例吗?非常感谢!

【问题讨论】:

    标签: wcf iis inversion-of-control mef


    【解决方案1】:

    您使用了“注入”一词,根据您的要求,我实际上建议您考虑使用 IoC 容器(Spring、Windsor、Unity 等),因为这将提供更大的灵活性。也有一些这样的例子:

    http://avingtonsolutions.com/blog/post/2008/08/02/Uisng-Unity-with-a-WCF-Service.aspx

    【讨论】:

    • 感谢您的帮助。我已经看过 Steve Moseley 的例子。问题是容器是“每个 WCF 端点”。使用 MEF,我知道这会阻止我在不同的端点之间共享导出的对象,这对我来说是个大问题。 Unity 在这方面有什么不同吗?
    • 所以当您说“共享组件”时,您的意思是共享组件应该保持一些状态/值,以便在各种服务中使用?
    • 是的。这些是单例。除了我希望我的 IoC 容器能够实现这一点,而不是硬编码它们。从我目前所读的内容来看,我需要一个静态工厂来组合我所有不同的服务。 Castle Windsor 将其命名为“WCF 集成设施”。我很想为 MEF 提供类似的东西。但我不知道如何让它在运行时按需自动连接每个服务实例。恐怕如果我有一个静态 CompositionContainer 并为每个服务实例调用 Compose() ,那么这将对已经组合的服务实例产生不利影响。
    • 你能不能使用 IExtension 之类的东西在服务启动时附加必要的单例?
    【解决方案2】:

    我多次遇到使 WCF 服务可组合的要求,而您确定的使用自定义 IInstanceProvider 的方法就是解决它的方法。除了编写自定义实例提供程序之外,您还需要服务行为和自定义服务主机。

    在代码示例方面,我在博客上记录了我的方法: http://www.timjroberts.com/2011/08/wcf-services-with-mef/

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您可以使用此nuget package。在项目站点,您可以找到几个如何在 Web 应用程序中使用该库或作为自托管服务的示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多