2010-07-08 77 views
1

我在MEF一個初學者,所以我有一個問題:) 我有以下幾點:MEF懶ImportMany與Creationpolicy.NonShared

[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實例嗎?我總是一樣的。

回答

9

馬修是正確的共享/ NonShared方面隻影響每個導入時給出的實例,每當你拉Lazy.Value時,你不會得到一個新的實例。如果你想要每次都得到一個新的實例並處理它,你可以使用ExportFactory來查看。目前,ExportFactory僅存在於MEF的Silverlight版本中,但在mef.codeplex.com上有一個示例項目,如果您確實需要此功能,則可將功能添加到MEF的桌面版本中。

+0

thx爲ExportFactory提示。我會試一下 :) – blindmeis 2010-07-09 08:12:00

3

不,因爲懶惰<>實例。 A Lazy<T>專爲延遲加載值而設計。該值在您第一次訪問.Value屬性時創建,並且之後爲該屬性的所有訪問返回相同的實例。 NonShared/Shared創建策略在導入過程中發揮作用,因此通過屬性注入,構造函數注入,字段注入等。 GetExportedValue等...

+0

謝謝。所以CompositionContainer.ReleaseExport(懶惰)也沒有工作嗎?我想要的只是處置懶惰的實例:) – blindmeis 2010-07-08 13:28:35