Вопрос

Я немного потерян с MEF, MAF, Unity ...

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

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

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

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

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

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

Итак, сначала о .net: Dotnet сохраняет только ссылка на плагины DLL в памяти или все Код плагина ?

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

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

Это было полезно?

Решение

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

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

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

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

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

Я подумываю использовать MEF с ленивой коллекцией импорта

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top