MEF/Unity integration point in Bootstrapper?

Mar 23, 2010 at 9:23 PM

What is a good place to insert the MEF integration code in a typical PRISM app with it's own bootstrapper?

The following use in the ComposeMEF method seems reasonable to me, but it raises a NotSupportException with the message "The invoked member is not supported in a dynamic assembly" when the bootstrapper Run method is called.

Thanks for any guidance.

-----------------------------
internal class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
var view = Container.Resolve<ShellView>();
view.Show();
return view;
}

protected override void ConfigureContainer()
{
base.ConfigureContainer();

ComposeMef(); // Start PRISM/MEF integration - is this appropriate usage?
}

private void ComposeMef()
{
// Setup
var unityContainer = new UnityContainer();
var aggregateCatalog = new AggregateCatalog();

// Register catalog
unityContainer.RegisterCatalog(aggregateCatalog);
}

protected override IModuleCatalog GetModuleCatalog()
{
return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
}

}

Coordinator
Mar 24, 2010 at 12:16 PM

The most common way is to override CreateContainer method:

protected virtual IUnityContainer CreateContainer()
{
    var container = new UnityContainer();
    container.RegisterCatalog(some catalog);

    return container;
}

Your code has one mistake. You create new Unity container within a ComposeMef method which is invoked in the ConfigureContainer method. This is effortless since when the ConfigureContainer method is launched, the container is already created for you. You can add a return statement for ComposeMef method and invoke it within CreateContainer method.

Hope this helps.

Piotr Włodek