我是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实例?我总是一样。
答案 0 :(得分:9)
Matthew关于Shared / NonShared方面的正确性只影响每次导入时给出的实例,每次拉动Lazy.Value时都不会得到新的实例。如果您想要的是每次获取一个新实例并进行处理,您可能会考虑使用ExportFactory。目前,ExportFactory仅存在于MEF的Silverlight版本中,但mef.codeplex.com上有一个示例项目,如果您确实需要此功能,则会将该功能添加到桌面版MEF中。
答案 1 :(得分:3)
不,因为Lazy&lt;&gt;实例。 Lazy<T>
设计用于延迟加载值。该值是在您第一次访问.Value
属性时创建的,之后将返回相同的实例,以便对该属性进行所有访问。 NonShared / Shared创建策略在执行导入过程时发挥作用,因此通过属性注入,构造函数注入,字段注入,。GetExportedValue
等...