MEF бросает CompositionContractMismatchException

1

При создании или использовании метода ExportProvider.GetExportedValues. Исключено изложениеContractMismatchException. Я конвертирую устаревший код, который был полон статическими фабриками, поэтому я просто хочу, например, выставить возвращаемые значения в контейнер MEF.

namespace fooProject
{
    static class SomeExportFactory
    {
        [Export(typeof(IFoo))]
        public static FooImp Generate()
        {
           return new FooImp();
        }
    }
}

Таким образом, эта простая иллюстрация создала бы исключение с этим сообщением "Невозможно использовать базовое экспортированное значение типа fooProject.SomeExportFactory.Generate(ContractName =" IFoo ") для ввода" IFoo "." для ввода "IFoo".].

Какие-нибудь догадки о том, что может быть причиной этого? Я уже просматривал Интернет и CompositionContractMismatchException при попытке использовать MEF с контроллером MVC - это закрытие, которое я могу найти, но у меня нет дубликатов сборок, подобных в этом случае.

Теги:
mef

1 ответ

2
Лучший ответ

Хорошо, я нашел ответ. Не экспортируйте статические функции !!!. Надеюсь, это поможет кому-то еще в этой ситуации.

MEF выдает критическое исключение, если вы пытаетесь экспортировать статическую функцию. Исключение выглядит как потенциально дублированные сборки. Как и некоторые ответы, но, увы.

Для людей, которые заинтересованы в более подробной информации, читайте (ссылки на текущие реализации MEF предоставляются). Код тормозит в ContractServices.cs. Вы найдете публичную статическую функцию "TryCast". Он обеспечивает механизм для MEF, чтобы предоставить экземпляр объекта, помещенного в бокс, к указанному типу. Но он проверяет только на 2 условия. Во-первых, объект, переданный в, уже имеет желаемый тип. Во-вторых, объект предоставляется через ExportedDelegate (возможно, как работает функция-член). Если ваш экспорт не соответствует ни одному из них, возвращается false, и сразу же возникает исключение CompositionContractMismatchException (см. Функцию ExportServices.cs T CastExportedValue (объект ICompositionElement, object exportedValue)).

Я бы хотел, чтобы в этой ситуации было выбрано DummyDontUseStaticException: p

Ещё вопросы

Сообщество Overcoder
Наверх
Меню