Previously, we learnt how to use SimpleContainer to set up our IoC Containers. We would be now looking into making the application more loosely coupled by leveraging the MEF. Just like with SimpleContainer, we would be focusing on the basic steps while configuring the IoC – Registering the IoC Container with Caliburn Micro and then registering the Service bindings. Let’s go ahead override the necessary methods
private CompositionContainer _Container; protected override object GetInstance(Type service, string key) { string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(service) : key; var exports = _Container.GetExportedValues(contract); if (exports.Any()) return exports.First(); else throw new Exception("Could not find the key"); } protected override void BuildUp(object instance) { _Container.SatisfyImportsOnce(instance); } protected override IEnumerable GetAllInstances(Type service) { return _Container.GetExportedValues(AttributedModelServices.GetContractName(service)); }
We will now go ahead and register our Service Bindings. This is where things get interesting.
protected override void Configure() { _Container = new CompositionContainer( new AggregateCatalog(AssemblySource.Instance.Select(x=> new AssemblyCatalog(x)).OfType()) ); var batch = new CompositionBatch(); batch.AddExportedValue(new WindowManager()); batch.AddExportedValue(new EventAggregator()); batch.AddExportedValue(_Container); _Container.Compose(batch); }
As seen in the code above, we are using the AssemblySource to parse the ViewModels in the Assembly.
That’s it in Bootstrapper, but do not forget to decorate your View Model class with [Export()] Attribute and Constructor with [ImportingConstructor]. (For injecting dependency)
[Export(typeof(IReport))] public class ReportViewModel :Screen, IReport { [ImportingConstructor] publicReportViewModel(IEventAggregator EventAggregator) { // Do Constructor tasks } }
We will delve into EventAggregators later, but for the moment, consider it an example of how to inject a dependency in the constructor when working with MEF.
Code sample for this post can be found here. The complete list of tutorials on Caliburn.Micro can be accessed here
4 thoughts on “Caliburn.Micro #005 : Bootstrapper with MEF”