2012-01-09 3 views
1

Я хочу создать экспорт на основе делегата для интерфейса, который вызывается для каждого вызова compose для возврата каждому потребителю нового экземпляра. Но, видимо, я всегда возвращаюсь к тому же экземпляру. Является ли это ограничением 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

+0

ExportFactory - это .NET 4.5, так что это не вариант. –

ответ

1

вы можете использовать ExportFactory с .NET4.0 тоже. Недавно Glenn Block опубликовал версию. Я использую его и в своих проектах.

+0

Очень странно, что такой очевидный сценарий не работает. Я мог бы использовать ExportFactory, если мне разрешено вводить новую версию MEF. Я буду отмечать это как ответ, так как не похоже, что есть больше оппонентов. –

Смежные вопросы