2011-08-18 46 views
3

我正在使用mef创建WCF Web服务。这是服务的样子:如何告诉MEF重新创建对象?

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

谢谢!

回答

4

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

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

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

+0

这是ContextManager他有问题,其他两个都很好。 –

+1

@Chirs - 是的,你是对的。我已经修改了我的答案。 –

+3

请注意,如果您导入Lazy 之类的东西,那么无论CreationPolicy Nonshared还是Shared,都会因为Lazy <>而始终获得相同的实例。想象一下[ImportMany]和元数据的情况 – blindmeis

2

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

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

+0

你好Daniel,这是非常随意的,但我有类似的问题,也许你可以检查出来吗? http://stackoverflow.com/questions/32901056/lazyt-always-create-a-new-object – Jannik