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

时间:2011-08-18 05:16:49

标签: wcf inversion-of-control mef

我正在使用mef来创建WCF Web服务。这就是服务的外观:

[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和标题并填充“上下文”。使用像我这样的代码 - 它是第一次创建,永远不会被破坏。如何改变这种行为?

谢谢!

2 个答案:

答案 0 :(得分:4)

在导出IContextManager的实现时,需要使用非共享部件创建策略标记导出。例如:

[Export(typeof(IContextManager)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ContextManager : IContextManager
{
   ...
}

这将通知MEF每次满足导入时都应该创建导出的新实例。默认情况下,MEF使用CreationPolicy.Shared,它只会创建一个导出值(单例),这可能是您希望用于电子邮件和日志记录的实现。

答案 1 :(得分:2)

您可以通过在导出的类上的PartCreationPolicyAttribute或ImportAttribute的RequiredCreationPolicy属性上设置部件的创建为“NonShared”。

这将在每次导入满足时使用导出创建类的新实例。如果这不是您想要的,您可能需要查看ExportFactory或作用域容器。但是,如果您使用的是.NET 4版本的MEF,则不支持ExportFactory,您必须为范围界定做更多工作。您可以在mef.codeplex.com预览下一版MEF。