MEF Lazy ImportMany с Creationpolicy.NonShared

Я новичок в mef и поэтому у меня есть вопрос:) у меня есть следующее:

[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);
        }

    }

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

[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? у меня всегда одно и то же.

2 ответа

Решение

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

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

Другие вопросы по тегам