MEF игнорирует создание политики - PullRequest
1 голос
/ 09 января 2012

Я хочу создать экспорт на основе делегата для интерфейса, который вызывается при каждом вызове compose для возврата каждому потребителю нового экземпляра.Но, очевидно, я всегда получаю один и тот же экземпляр.Это ограничение MEF (я использую .NET 4.0)?

Вот пример кода, как я пытался создавать свежие экземпляры для каждого вызова compose:

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()));
        }
    }
}

Ожидаемый результат:

  • Создать новый
  • Создать новый

Фактический вывод

  • Создать новый

1 Ответ

1 голос
/ 11 января 2012

вы можете использовать ExportFactory также с .NET4.0. Гленн Блок опубликовал версию некоторое время назад. я тоже использую его в своих проектах.

...