使用具有非共享创建策略的 mef 组合导出值,但未将其指定为属性

compose exported value with mef with non-shared creation policy, but without specify it as attribute

我有一个 class 的实例,我明确创建了它并将其组合到 CompositionContainer:

        container.ComposeExportedValue<ILogger>(_logger);

出于某些原因,我不得不明确地创建它并编写它。我无法使用导出属性。

在我导入 ILogger 的每个地方,我都是通过 ctor 来完成的,例如:

public class A
{
    private readonly ILogger _logger;

    [ImportingConstructor]
    public A(ILogger logger)
    {
        this._logger = logger;
    }
}

这样一来,我在导入它的每个地方都会收到相同的 ILogger 实例。

问题是,是否可以在不使用 [PartCreationPolicy(CreationPolicy.NonShared)] 属性的情况下配置为每次导入时创建一个新的相同实例?

我会提醒您,我无法使用属性(否则我会简单地使用该属性)

试试看:

public class LoggerComposablePart : ComposablePart
{
    private readonly IEnumerable<ExportDefinition> exportDefinitions;

    public override IEnumerable<ExportDefinition> ExportDefinitions
    {
        get { return exportDefinitions; }
    }

    public override IEnumerable<ImportDefinition> ImportDefinitions
    {
        get { return Enumerable.Empty<ImportDefinition>(); }
    }

    public LoggerComposablePart()
    {
        Dictionary<string, object> metadata = new Dictionary<string, object>();

        metadata.Add(CompositionConstants.ExportTypeIdentityMetadataName, AttributedModelServices.GetTypeIdentity(typeof(ILogger)));
        metadata.Add(CompositionConstants.PartCreationPolicyMetadataName, CreationPolicy.NonShared);

        exportDefinitions = new ExportDefinition[] { new ExportDefinition(AttributedModelServices.GetContractName(typeof(ILogger)), metadata) };
    }

    public override object GetExportedValue(ExportDefinition definition)
    {
        // Create new logger instance for each import
        return new Logger();
    }

    public override void SetImport(ImportDefinition definition, IEnumerable<Export> exports)
    {
    }
}

然后例如:

CompositionBatch batch = new CompositionBatch();

batch.AddPart(new LoggerComposablePart());

container.Compose(batch);

var x = container.GetExportedValue<A>();