MEF ImportCardinalityMismatchException - PullRequest
       68

MEF ImportCardinalityMismatchException

0 голосов
/ 19 марта 2020

System.ComponentModel.Composition.ImportCardinalityMismatchException 'Не найдено ни одного экспорта, соответствующего ограничению: ContractName IntroToMEF.DigitalMonitor RequiredTypeIdentity IntroToMEF.IMonitor' '

Мои типы верны. Я могу получить экспортированное значение, если у меня есть только один экземпляр, наследующий от IMonitor. Всякий раз, когда мне нужно использовать имя контракта, я получаю сообщение об ошибке. У меня нет идей.

Очистка кэша Visual Studio не работает.

[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;         
    }
...