PRISM + MEF + MVVM -- Not sure where to really start?

michael picture michael · Feb 9, 2011 · Viewed 9.1k times · Source

What I'm using:

  • Visual Studio 2010
  • Microsoft .NET Framework 4
  • Prism v4

What I am trying to figure out is how to get started with Prism + MEF while maintaining the MVVM pattern. When I go into the Prism Quickstarts, it has a Prism + MEF, but the comments in the project specifically state that the Quickstart example does not implement MVVM. I'm not really sure what to mix/match so that my shell itself follows MVVM (and regions).

Basically, I want to use MEF to be able to load Assemblies (Modules) at run-time. And, I want to setup regions in my Shell and have the Shell use MVVM (so I can databind things to the shell). Every example online is either Prism, Prism + MVVM, Prism + Unity, Silverlight examples, Prism + MEF, etc. But I can not find any WPF Prism + MEF + MVVM examples or information. I really have no idea how to setup my bootstrapping and such to get going.

Once that part is done, I'm sure I'll figure out how to load other controls using MVVM into my shell. Any help would be great, especially resources that deal directly with this situation as apposed to something similar (i.e. Prism + Unity and without MEF). Thanks!

Answer

RoelF picture RoelF · Apr 13, 2015

I have never used Prism+MEF myself, but in your question you mention you want to be able to load modules at runtime (with MEF). This is something you don't need to have MEF for, because Prism is quite good at doing that itself. The setup is pretty simple:

First, create a Prism module by implementing Modularity.IModule. It only requires one method: Initialize(). Here you can do any setup needed for your module. I generally also extend the constructor to inject any other interfaces I might need (using Unity).

Then, create a ModuleCatalog to specify the details of the module you created:

<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>

The InitializationMode is what you want to set if you need runtime loading. The catalog can be loaded in the Prim bootstrapper:

catalog = Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(new Uri("Modules.xaml", UriKind.RelativeOrAbsolute));

Then all you need to do to load up your module, is get a reference to IModuleManager (Dependency Injection, yay!) and load up the module:

if (loadModule1)
    var myModule = moduleManager.LoadModule("Module1");

Now the module is known to Prism. Keep in mind that unloading is not supported by Prism.