我正在使用 mef 创建 WCF 网络服务。这是服务的样子:
[Export]
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class MobileService
{
[Import]
public IEmailService EmailService { get; set; }
[Import]
public ILoggerService LoggerService { get; set; }
[Import]
public IContextManager ContextManager { get; set; }
这是检索服务实例的代码:
// Get Service instace via MEF
public object GetInstance(InstanceContext instanceContext, Message message)
{
var lazyInstance = Container.GetExports(ServiceType, null, null).FirstOrDefault();
var instance = lazyInstance.Value;
return instance;
}
MEF 创建了 EmailService、LoggerService,如果一切正常,它们会在服务存在时快乐地生活。
现在,ContextManager 是不同的动物。在 GetInstance - 我真的很喜欢“杀死”它并重新创建。 ContextManager 在构造期间研究 URL 和 header 并填充“上下文”。使用像我这样的代码 - 它是第一次创建并且永远不会被破坏。如何改变这种行为?
谢谢!
最佳答案
在导出 IContextManager 的实现时,您需要使用非共享部分创建策略来标记导出。例如:
[Export(typeof(IContextManager)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ContextManager : IContextManager
{
...
}
这将通知 MEF 它应该在每次满足导入时创建一个新的导出实例。默认情况下,MEF 使用 CreationPolicy.Shared,它将仅创建一个导出值(单例),这可能是您想要用于电子邮件和日志记录实现的内容。
关于wcf - 如何告诉 MEF 重新创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7102699/