Менеджер плагинов C # .NET 4.0 Forms - PullRequest
0 голосов
/ 29 января 2011

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

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

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

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

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

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

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

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

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

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

1 Ответ

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

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

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

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

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

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

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

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

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

...