C# .NET 4.0 Диспетчер подключаемых модулей форм

Я немного запутался с MEF, MAF, Unity...

Этот вопрос касается архитектуры приложения Winform.

У меня есть основной проект, который содержит основную форму и некоторые другие формы;

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

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

Затем я хотел бы удалить их, пока они не будут вызваны.

Но я не хочу, чтобы все плагины хранились в памяти... просто чтобы получить хорошую архитектурную модель.

Итак, сначала о .NET: хранит ли dotNet только ссылку на плагины dll в памяти или весь код плагина?

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

Если я установлю для коллекции импорта значение null и снова запущу функцию compose(), плагины будут загружены или будут ждать вызова для загрузки (ленивый)?


person guillaume    schedule 29.01.2011    source источник
comment
Не могли бы вы попробовать перефразировать свой вопрос? Кажется немного запутанным и общим.   -  person tomfanning    schedule 29.01.2011
comment
это лучше ? извините, это было действительно непонятно   -  person guillaume    schedule 29.01.2011


Ответы (1)


Затем я хотел бы избавиться от них, пока они не будут вызваны.

Вместо того, чтобы проверять импортированные объекты, а затем выбрасывать их, вам следует проверить импортированные метаданные. . Вы можете получить эти метаданные, импортировав Lazy<IFoo,IFooMetadata> или Lazy<IFoo,Dictionary<string,object>>. Вы можете добавить эти метаданные в экспорт с помощью атрибута ExportMetadata.

Итак, сначала о .NET: хранит ли dotNet в памяти только ссылки на подключаемые модули dll или весь код подключаемых модулей?

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

Кроме того, в .NET 4.0 нет готовых реализаций ComposablePartCatalog, которые можно было бы запрашивать без загрузки соответствующей сборки. Но теоретически что-то подобное можно было бы сделать, если хранить метаданные где-то вне сборки. Пример такой реализации есть в коде MEF на codeplex.

Я думаю об использовании MEF с LAZY коллекцией Import

Использование отложенного импорта не обязательно предотвратит загрузку сборок. Если у вас есть ссылка на объект Lazy<IFoo>, то должна быть загружена как минимум сборка, содержащая IFoo. И, как я объяснял выше, в этот момент также будет загружена сборка, содержащая экспортированную реализацию IFoo.

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

person Wim Coenen    schedule 29.01.2011