Как получить информацию о сборке импортированного UserControl через MEF, не создавая экземпляр UserControl? - PullRequest
1 голос
/ 22 января 2011

Можно ли получить информацию о сборке из импортированного MEF-типа без создания экземпляра типа ? Мне нужно знать имя сборки и версию элемента управления Plugin, который содержит тип. Попробовал следующее, но он просто возвращает System.ComponentModel.Composition.

foreach (Lazy<UserControl, IMetadata> content in contents)
{
    // get assembly information of the Plugin control for the imported function 
    string definingAssembly = content.GetType().Assembly.GetName();
    Console.WriteLine(definingAssembly);
}

Чтобы по возможности избежать проблем с обслуживанием, я хочу не указывать эту информацию в метаданных.

Ответы [ 3 ]

2 голосов
/ 22 января 2011

Это часто задаваемые вопросы, которые появляются на форуме MEF время от времени. (Я уверен, что есть несколько лучших тем, в которых есть ответ, но я не могу сразу его найти).

MEF не поддерживает проверку типа детали ленивого импорта (без создания экземпляра этой детали) из коробки. Вероятно, это связано с двумя элементами философии дизайна:

  1. MEF способствует слабой связи. Вы должны указать и использовать импорт на основе их контракта. Полагаясь на фактический тип класса импорта, вы не сможете изменить состав в будущем.

  2. MEF позволяет ленивую загрузку типов. Предположим, что существует свойство Lazy.PartType, которое вы можете использовать для проверки фактического типа детали. Это заставит загружать тип детали и содержащую сборку. Затем на основе PartType вы решаете, что не хотите создавать экземпляр этой конкретной детали, и загрузка сборки была напрасной.

    (Насколько я могу судить, в настоящее время MEF еще не использует вторую конструктивную особенность из коробки. AssemblyCatalog будет проверять все типы сразу же, когда вызывается AssemblyCatalog.Parts. Но в источниках MEF есть пример, который показывает, как кэшировать информацию о сборках, чтобы задерживать или избегать загрузок сборок.)

Таким образом, вместо того, чтобы полагаться на точный тип детали, вы должны добавить некоторые метаданные, которые можно использовать для выбора импорта.

0 голосов
/ 22 августа 2011

Я думал об этой проблеме, так как сам столкнулся с этой проблемой. Где я хочу создавать экземпляры по требованию, а не создавать их для меня композицией.

Сценарий, который у меня есть, заключается в том, что мне не нужно знать конкретный тип, но мне может понадобиться создать несколько экземпляров типа, использовать их и при необходимости утилизировать. Решение, которое я придумал, состоит в том, чтобы вместо использования MEF загружать конкретные типы и заставлять его создавать экземпляры для меня, использовать MEF для загрузки фабрик, которые знают, как создавать экземпляры типа, который я хочу контролировать временем жизни. *

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

0 голосов
/ 22 января 2011

То, что вы попробовали, должно потерпеть неудачу, так как сборка никогда не может быть динамически загруженной сборкой модуля.

Полагаю, если вы не создаете экземпляр типа, сборка этого модуля даже не загружается в память.

Вы уже пытались писать на форуме MEF?Там вы можете встретиться с разработчиками.

http://mef.codeplex.com/discussions

...