Как сказать MEF пересоздать объект? - PullRequest
3 голосов
/ 18 августа 2011

Я использую 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 и заголовки во время построения и заполняет «контекст».С таким кодом, как у меня - он создается впервые и никогда не уничтожается.Как изменить это поведение?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

При экспорте реализации IContextManager вам необходимо пометить экспорт политикой создания не разделяемой части.Например:

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

Это сообщит MEF, что он должен создавать новый экземпляр экспорта каждый раз, когда он удовлетворяет импорту.По умолчанию MEF использует CreationPolicy.Shared, который создаст только одно экспортированное значение (одноэлементное), что, вероятно, является тем, что вам нужно для реализаций электронной почты и ведения журнала.

2 голосов
/ 18 августа 2011

Вы можете сделать создание детали "NonShared", установив его в атрибут PartCreationPolicyAttribute экспортируемого класса или в свойство RequiredCreationPolicy объекта ImportAttribute.

Это создаст новый экземпляр класса с экспортом каждый раз, когда выполняется импорт. Если это не совсем то, что вы хотите, вы можете посмотреть на ExportFactory или контейнеры с областями видимости. Однако если вы используете версию MEF для .NET 4, ExportFactory не поддерживается, и вам придется проделать гораздо больше работы для определения объема. Предварительный просмотр следующей версии MEF можно получить по адресу mef.codeplex.com .

.
...