使用具有非共享创建策略的 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>();
我有一个 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>();