MEF Ошибка экспорта не может быть назначена типу - PullRequest
5 голосов
/ 18 октября 2010

Я только начал использовать MEF и столкнулся с ранней проблемой.

У меня есть интерфейс под названием DataService:

namespace DataAccess
{
  interface IDataService
  {
    string Name { get; }
    string Description { get;}

    List<String> GetPeople();
  }
}

Существует 2 реализации этого интерфейса, одна для SQLСервер и один для Oracle.Ниже приведена реализация Oracle, реализация SQL Server точно такая же.

namespace DataAccess
{
[Export(typeof(IDataService))]
[ExportMetadata("Name","Oracle")]
[ExportMetadata("Description","Oracle Data Service")]
public class Oracle : IDataService
{

    #region IDataService Members

    public string Name
    {
        get { return "Oracle"; }
    }

    public string Description
    {
        get { return "Provides data access to Oracle database"; }
    }

    public List<string> GetPeople()
    {
        return new List<String>() { "Oracle boo", "Oracle boo1" };
    }

    #endregion
}
}

Свойства имени и описания теперь больше не существуют, поскольку я заменил их метаданными.Как видите, это очень простые объекты, я хотел убедиться, что смогу заставить это работать до того, как начну выполнять тяжелую работу.

Вот код, который я использую для обнаружения сборок:

    private static CompositionContainer _container;
    private const string ASSEMBLY_PATTERN = "*.dll";
    private AggregateCatalog _catalog; 

    [ImportMany]
    IEnumerable<DataAccess.IDataService> services { get; set; }

    private void button3_Click(object sender, EventArgs e)
    {


        _catalog = new AggregateCatalog(
            new DirectoryCatalog(txtLibPath.Text, ASSEMBLY_PATTERN),
            new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        _container = new CompositionContainer(_catalog);
        _container.ComposeParts(this);
        MessageBox.Show(services.Count().ToString());
    }

Произошла ошибка:

Композиция вызвала единственную ошибку композиции.Основная причина приведена ниже.Для получения более подробной информации просмотрите свойство CompositionException.Errors.

1) Экспорт «DataAccess.Oracle (ContractName =" DataAccess.IDataService ")" нельзя назначить типу «DataAccess.IDataService».

В результате: невозможно установить импорт 'MEFTest.Form1.services (ContractName = "DataAccess.IDataService") "для части" MEFTest.Form1 ".Элемент: MEFTest.Form1.services (ContractName = "DataAccess.IDataService") -> MEFTest.Form1

Кажется, нет никакого смысла в том, что он не может назначить интерфейсу, который был разработанfor!

Как только эта проблема будет решена, моя следующая проблема - как выбрать один и получить его экземпляр ...

Ответы [ 3 ]

6 голосов
/ 18 октября 2010

Похоже, загружаются две разные версии вашей контрактной сборки (одна с DataAccess.IDataService).Один, вероятно, из вашего пути к исполняемому файлу, а другой - из вашего пути к плагину.Я немного затронул эту проблему в своем блоге на Как отлаживать и диагностировать ошибки MEF , а на странице MSDN на Рекомендации по загрузке сборки более подробно.

0 голосов
/ 29 мая 2016

Я должен сказать, что у меня была такая ошибка в совершенно идиотском контексте. Случайно я потерял директиву export и поместил ее не в класс, а в функцию внутри класса:

interface MyInterface
{
  void MyFunction();
}

public class MyClass : MyInterface
{
  [Export(typeof(MyInterface))]
  void MyFunction() { }
}

Удивительно, но код скомпилирован очень хорошо без каких-либо предупреждений. Но потом я потратил часы, пытаясь понять, почему MEF не справляется с моей глупой опечаткой!

0 голосов
/ 08 июля 2015

Для меня это было очень просто исправить.

Вот ссылка !это объясняет коренную причину.

В моем случае я заблокировал свою версию сборки, но версия моего файла перемещается.Мой идентификатор пакета nuget соответствует моей версии файла сборки.

Окончательный результат заключается в том, что я могу строить постоянно, создавать новые нюансы и не иметь этой проблемы с интерфейсом MEF.

...