System.ComponentModel.Composition.ImportCardinalityMismatchException‘没有发现与约束相匹配的出口: ContractName IntroToMEF.DigitalMonitor RequiredTypeIdentity IntroToMEF.IMonitor’
我的类型是对的。如果只有一个从IMonitor继承的实例,我就能够得到导出的值。每当我需要使用合同名称时,我都会得到一个错误。我没有主意了。
清除Visual缓存不起作用.
[Export(typeof(IMonitor))]
public class DigitalMonitor : IMonitor
{
public void start()
{
Console.WriteLine("Digital Monitor: Started monitoring");
}
}
internal class HostMefInApp
{
[Import]
public ILogger logger { get; set; }
[Import]
public IMonitor monitor { get; set; }
private void ComposeMultiple()
{
Console.WriteLine("DEBUG:" + GetType().Assembly);
var assemblyCatalog = new AssemblyCatalog(GetType().Assembly);
var container = new CompositionContainer(assemblyCatalog);
// var contractName = AttributedModelServices.GetContractName(typeof(FileLogger));
try
{
var instancesOfFileLogger = container.GetExports<ILogger>(); //"IntroToMEF.FileLogger"
}
catch (ImportCardinalityMismatchException ex)
{
Console.WriteLine(ex);
}
CompositionBatch batch = new CompositionBatch();
batch.AddPart(AttributedModelServices.CreatePart(new FileLogger()));
batch.AddPart(AttributedModelServices.CreatePart(new DigitalMonitor()));
batch.AddPart(AttributedModelServices.CreatePart(new AnalogMonitor()));
container.Compose(batch);
var digitalMonitorContractName = AttributedModelServices.GetContractName(typeof(DigitalMonitor));
var currentLogger = container.GetExportedValue<ILogger>();
var digitalMonitor = container.GetExportedValue<IMonitor>(digitalMonitorContractName);
logger = currentLogger;
monitor = digitalMonitor;
}发布于 2021-03-01 15:36:38
我认为你应该:
[Export(typeof(IMonitor))]
[Export(typeof(DigitalMonitor))]
public class DigitalMonitor : IMonitor
{
public void start()
{
Console.WriteLine("Digital Monitor: Started monitoring");
}
}意思是将DigitalMonitor导出为IMonitor和DigitalMonitor。这将为您提供使用两种方式导入它的可能性。当然,您的代码将使用:
var digitalMonitor = container.GetExportedValue<DigitalMonitor>();https://stackoverflow.com/questions/60750488
复制相似问题