2010-07-08 1 views
1

я новичок в MEF и поэтому у меня есть вопрос :) я следующее:MEF Ленивый ImportMany с Creationpolicy.NonShared

[PartCreationPolicy(CreationPolicy.Shared)] 
[Export(typeof(SharedExport))] 
public class SharedExport : INPCBase 
{ 
    [ImportMany(typeof(INonShared),RequiredCreationPolicy = CreationPolicy.NonShared)] 
    private IEnumerable<Lazy<INonShared,Dictionary<string,object>>> fac; 

    ... 

    public void Open() 
    { 
     foreach (var lazy in fac) 
     { 
      this.Muster.Add(lazy.Value); 
     } 

    } 

импортированные классы все помечены как NonShared.

[PartCreationPolicy(CreationPolicy.NonShared)] 
[Export(typeof(INonShared))] 
[ExportMetadata("Muster","030")] 
public sealed class NonShared1 : INPCBase, INonShared 
{ 
    public NonShared1() 
    { 
     Debug.WriteLine("ctor NonShared1" + this.GetHashCode().ToString()); 
    } 

    #region Implementation of INonShared 

    public string Displayname 
    { 
     get { return "Muster 030 "+ this.GetHashCode().ToString(); 
     } 
    } 

    #endregion 
} 

сейчас мой вопрос: когда Open() выполнить, не должен ли всегда создаваться новый экземпляр NonShared1? я всегда был тем же.

ответ

9

Matthew правильно относится к аспекту Shared/NonShared, влияющему только на экземпляр, заданный при каждом импорте, вы не получите новый экземпляр каждый раз, когда вы тянете Lazy.Value. Если вы хотите получить новый экземпляр каждый раз и избавиться от него, вы можете посмотреть на использование ExportFactory. В настоящее время ExportFactory существует только в версии Silverlight MEF, но есть пример проекта на mef.codeplex.com, который добавляет функциональность к настольной версии MEF, если вам действительно нужна эта функциональность.

+0

thx для подсказки ExportFactory. Я дам ему попробовать :) – blindmeis

3

Нет, из-за Lazy <> экземпляр. A Lazy<T> предназначен для ленивой загрузки значения. Значение создается при первом обращении к свойству .Value, и тот же экземпляр возвращается для последующего доступа к этому свойству. Политика создания NonShared/Shared вступает в игру, производя процесс импорта, поэтому путем инъекции свойств, инъекции конструктора, инъекции поля. GetExportedValue и т. Д.

+0

спасибо. поэтому CompositionContainer.ReleaseExport (ленивый) тоже не работал? все, что я хочу, - это распоряжаться ленивым экземпляром :) – blindmeis