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
так далее...