MEF Lazy ImportMany with Creationpolicy.NonShared

时间:2010-07-08 12:39:09

标签: c# mef lazy-evaluation

我是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 个答案:

答案 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等...