我们有一个控制台应用程序,它使用ServiceHost
类托管我们的所有WCF服务。
为了能够使用MEF,我们有一个IInstanceProvider
实现,用于引导MEF合成容器。使用IContractBehaviorAttribute
将该实例提供程序分配给服务。
public class MefBehaviorAttribute : Attribute, IContractBehavior, IContractBehaviorAttribute
{
void IContractBehavior.ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
dispatchRuntime.InstanceProvider = new MefInstanceProvider(contractDescription.ContractType);
}
...
}
到目前为止,一切正常。
对于特定的服务实现,我想应用一个ServiceBehavior
属性,将其InstanceContextMode
设置为“单一”,以使服务成为单例。
[Export(typeof(IService))]
[MefBehavior]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Service : ServiceBase, IService, IDisposable
{
[Import]
private IImportedClass instance;
...
现在的问题是,ServiceHost
实例化后立即创建了服务实例。到那时,合同行为尚未分配,因此尚未执行,这导致组合错误,因为组合容器尚未自举。
创建可以使用MEF的单例服务实例的正确方法是什么?