wcf - 如何告诉 MEF 重新创建对象?

标签 wcf inversion-of-control mef

我正在使用 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/

相关文章:

wcf - 在合约操作执行过程中调用回调

inversion-of-control - 泛型类型依赖注入(inject) : How to inject T

.net - 插件向后兼容性

wcf - 将 OperationContext.Current 存储在 WCF 服务实例的实例变量中

wcf - NHibernate CallSessionContext 与 ThreadStaticSessionContext

c# - 如何自动注入(inject)到所有子对象

c# - MEF 和 DirectoryCatalog

c# - 具有开放通用类型的 MEF

.net - WCF WebHttp 混合身份验证(基本和匿名)

c# - 如何用 IOC 替换 switch 语句以便我可以保持 SOLID 原则