我刚开始玩MEF并且有几个问题。
1)我写了一个WCF服务,它接受一些xml并将xml传递给解析器。解析器使用MEF组成。 (xml中的元数据让我确定要使用的解析器)。我可以通过将dll放在目录中来添加新的解析器并支持新的XML。那部分都有效。但是,WCF服务可以多次实例化,我希望我的解析器目录是静态的,也就是说,如果我的服务的多个实例都是旋转的,并且它们获得相同的XML,我只需要运行一个解析器实例,写得是线程安全的。我似乎无法配置MEF来执行此操作。谁知道怎么做?
2)我可以将新的解析器放入目录中,目录刷新会自动发现它,效果很好。但是,如果我尝试将修改后的dll删除到目录中,并且该服务中已激活该解析器,则会收到错误消息,指出该文件正在使用中。有没有办法覆盖这个?
答案 0 :(得分:2)
1)听起来你应该让你的MEF容器和目录静态,这样它们只能创建一次。确保通过使用带有isThreadSafe参数的构造函数并将其设置为true来指定CompositionContainer应该是线程安全的。
2)您可以启用卷影复制,以防止在加载DLL时锁定文件。但是,您无法从.NET中的AppDomain卸载DLL,而且重新组合可在多个线程上使用的CompositionContainer是不安全的。换句话说,使用isThreadSafe参数只会使容器线程安全,从容器中“读取”/拉出口,而不是通过合成/重构来修改它。
因此,如果您想添加新的解析器,最好重新启动该服务。