Я никогда не использовал Prism + MEF, но в своем вопросе вы упоминаете, что хотите загружать модули во время выполнения (с MEF). Это то, что вам не нужно иметь MEF, потому что Prism вполне хорош в этом сам. Настройка довольно проста:
Сначала создайте модуль Prism, реализовав Modularity.IModule
. Требуется только один метод: Initialize()
. Здесь вы можете выполнить любую настройку, необходимую для вашего модуля. Я обычно также расширяю конструктор, чтобы внедрить любые другие интерфейсы, которые мне могут понадобиться (используя Unity).
Затем создайте ModuleCatalog, чтобы указать детали созданного вами модуля:
<Modularity:ModuleCatalog
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism.Composition">
<Modularity:ModuleInfo Ref="Your.ModuleProject.dll"
ModuleType="Your.ModuleProject.Module, Your.ModuleProject"
ModuleName="Module1"
InitializationMode="OnDemand" />
</Modularity>
InitializationMode
- это то, что вы хотите установить, если вам нужна загрузка во время выполнения. Каталог можно загрузить в загрузчик Prim:
catalog = Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(new Uri("Modules.xaml", UriKind.RelativeOrAbsolute));
Тогда все, что вам нужно сделать для загрузки вашего модуля, это получить ссылку на IModuleManager
(Dependency Injection, yay!) И загрузить модуль:
if (loadModule1)
var myModule = moduleManager.LoadModule("Module1");
Теперь модуль известен Prism. Помните, что выгрузка не поддерживается Prism.