2012-01-09 52 views
1

我想創建一個接口的基於委託的導出,該接口在每個組合調用被調用時返回每個使用者一個新實例。但顯然我總是會回到同一個例子。這是MEF的限制(我正在使用.NET 4.0)?MEF忽略CreationPolicy

下面是示例代碼,我如何試圖創建新實例爲每個撰寫電話:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.Composition; 
using System.ComponentModel.Composition.Hosting; 
using System.ComponentModel.Composition.Primitives; 

namespace TestApp 
{ 
    class Program 
    { 
     [Import(RequiredCreationPolicy = CreationPolicy.NonShared)] 
     ITest Instance { get; set; } 

     static void Main(string[] args) 
     { 
      CompositionContainer container = new CompositionContainer(); 
      CompositionBatch batch = new CompositionBatch(); 
      AddExportedValue<ITest>(batch,() => 
      { 
       Console.WriteLine("Create new"); 
       return new Haha(); 
      }, CreationPolicy.NonShared); 

      container.Compose(batch); 

      Program p1 = new Program(); 
      container.SatisfyImportsOnce(p1); 
      // Why do I see only one "Create new" print although CreationPolicy on import and export level is NonShared? 
      container.SatisfyImportsOnce(p1); 
     } 

     interface ITest 
     {} 

     class Haha : ITest 
     {} 

     static ComposablePart AddExportedValue<iT>(CompositionBatch batch, Func<iT> factory, CreationPolicy policy) 
     { 
      string contractNameAndTypeIdentity = AttributedModelServices.GetContractName(typeof(iT)); 
      IDictionary<string, object> metadata = new Dictionary<string, object>(); 
      metadata.Add(CompositionConstants.ExportTypeIdentityMetadataName, contractNameAndTypeIdentity); 
      metadata.Add(CompositionConstants.PartCreationPolicyMetadataName, policy); // <--- the policy seems to be ignored by MEF although incompatible policies are errored out with an exception. 
      return batch.AddExport(new Export(contractNameAndTypeIdentity, metadata,() => factory())); 
     } 
    } 
} 

預期輸出:

  • 創建新
  • 創建新

實際產量

  • 創建新
+0

爲什麼不使用ExportFactory每次都得到一個新實例 – blindmeis 2012-01-09 10:04:42

+0

ExportFactory是.NET 4.5所以這不是一個選項。 – 2012-01-09 10:52:32

回答

1

可以使用ExportFactory與.NET4.0了。 Glenn Block前段時間發佈了一個版本。我也在我的項目中使用它。

+0

這樣一個明顯的場景不起作用是很奇怪的。如果允許我引入新的MEF版本,我可以使用ExportFactory。我將這個標記爲答案,因爲它看起來不像是更多的opton。 – 2012-01-17 11:27:30