2012-01-09 49 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