2010-07-12 38 views
1

我刚开始玩MEF并有几个问题。有关在WCF服务中使用MEF的问题

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

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

回答

2

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

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

所以,如果你想添加一个新的解析器,最好重新启动服务。

+0

感谢您抽出时间Daniel。是的,我试过号码1,没有工作。不知道为什么,虽然现在想,但我是否可以将它放在单独的类中,因此它是基于实例的,不是静态的,而是对该类的静态引用。我会尝试的。 2,我同意。但我希望丢弃一个DLL类似于放弃web.config更改,它会自动强制执行一次回收。但是如果不停止服务,我甚至不能放弃dll。 – 2010-07-14 12:52:45