Я хочу создать экспорт на основе делегата для интерфейса, который вызывается для каждого вызова 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()));
}
}
}
Ожидаемый результат:
- Создать новый
- Создать новый
Фактический результат
- Создать новый
Почему бы не использовать ExportFactory для получения нового экземпляра каждый раз – blindmeis
ExportFactory - это .NET 4.5, так что это не вариант. –