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