【问题标题】:questions about using MEF in a WCF service关于在 WCF 服务中使用 MEF 的问题
【发布时间】:2010-07-12 17:17:53
【问题描述】:

我刚开始玩 MEF,有几个问题。

1) 我编写了一个 WCF 服务,它接收一些 xml 并将 xml 传递给解析器。解析器是使用 MEF 组成的。 (xml 中的元数据让我确定使用哪个解析器)。我可以添加一个新的解析器,并支持新的 XML,只需将 dll 放到一个目录中。那部分一切正常。但是,WCF 服务可以被实例化多次,我希望我的解析器目录是静态的,也就是说,如果我的服务的多个实例被启动,并且它们得到相同的 XML,我只需要一个解析器实例运行,它们被写成线程安全的。我似乎无法配置 MEF 来执行此操作。有人知道怎么做吗?

2) 我可以将一个新的解析器放入目录中,目录刷新会自动发现它,效果很好。但是,如果我尝试将修改后的 dll 放入目录中,并且该解析器已在服务中激活,则会收到一条错误消息,指出该文件正在使用中。有没有办法覆盖它?

【问题讨论】:

    标签: wcf mef


    【解决方案1】:

    1) 听起来您应该将 MEF 容器和目录设为静态,以便它们只创建一次。通过使用带有 isThreadSafe 参数的构造函数并将其设置为 true,确保您指定 CompositionContainer 应该是线程安全的。

    2) 您可以启用卷影复制,这将防止文件在加载 DLL 时被锁定。但是,您不能从 .NET 中的 AppDomain 中卸载 DLL,而且重构可在多个线程上使用的 CompositionContainer 也不安全。换句话说,使用 isThreadSafe 参数只会使容器对于“读取”/从容器中提取导出是线程安全的,而不是通过组合/重组来修改它。

    因此,如果您想添加新的解析器,最好重新启动服务。

    【讨论】:

    • 感谢您抽出宝贵时间丹尼尔。是的,我试过1号,没有用。不知道为什么,虽然现在想起来,但我想知道是否可以将它放在一个单独的类中,所以它是基于实例的,而不是静态的,而是对该类的引用是静态的。我会试试的。 2,我同意。但我曾希望删除 DLL 类似于删除 web.config 更改,它会自动强制回收。但我什至不能在不停止服务的情况下删除 dll。
    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 2017-07-04
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多