C# .net 4.0 Forms Manager
Вопрос
Я немного потерян с 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 только откладывает вызов некоторых конструкторов, что, надеюсь, приведет к более быстрому запуска вашего приложения.