首页
学习
活动
专区
圈层
工具
发布

MEF
EN

Stack Overflow用户
提问于 2020-03-19 03:25:32
回答 1查看 477关注 0票数 1

System.ComponentModel.Composition.ImportCardinalityMismatchException‘没有发现与约束相匹配的出口: ContractName IntroToMEF.DigitalMonitor RequiredTypeIdentity IntroToMEF.IMonitor’

我的类型是对的。如果只有一个从IMonitor继承的实例,我就能够得到导出的值。每当我需要使用合同名称时,我都会得到一个错误。我没有主意了。

清除Visual缓存不起作用.

代码语言:javascript
复制
[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;         
    }
EN

回答 1

Stack Overflow用户

发布于 2021-03-01 15:36:38

我认为你应该:

代码语言:javascript
复制
[Export(typeof(IMonitor))]
[Export(typeof(DigitalMonitor))]
public class DigitalMonitor : IMonitor
{
    public void start()
    {
        Console.WriteLine("Digital Monitor: Started monitoring");
    }
}

意思是将DigitalMonitor导出为IMonitor和DigitalMonitor。这将为您提供使用两种方式导入它的可能性。当然,您的代码将使用:

代码语言:javascript
复制
var digitalMonitor = container.GetExportedValue<DigitalMonitor>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60750488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档