MEF Lazy ImportMany с Creationpolicy.NonShared - PullRequest
1 голос
/ 08 июля 2010

Я новичок в 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);
        }

    }

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

Ответы [ 2 ]

9 голосов
/ 08 июля 2010

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

3 голосов
/ 08 июля 2010

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

...