MEF is all about extending applications. It allows you to specify a contract that "extenders" need to fulfill. But it's more. It also allows you to separate concerns in your application. MEF is now available for Silverlight. This screencast shows how to use MEF to make Silverlight applications extensible (by yourself or 3rd parties).
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
GetData.Click += new RoutedEventHandler(GetData_Click);
}
void GetData_Click(object sender, RoutedEventArgs e)
{
}
}
[Import("CityName")]
public string CityName;
public class City
{
[Export("CityName")]
public string Name
{
get
{
return "Boston";
}
set { }
}
}
var catalog = new PackageCatalog();
catalog.AddPackage(Package.Current);
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
OurTextBox.Text = CityName;
[ImportMany("Cities", AllowRecomposition=true)]
public ObservableCollection<String> Cities{get;set;}
public class CityContainer
{
[Export("Cities")]
public string City1 = "Chicago";
[Export("Cities")]
public string City2 = "Seattle";
[Export("Cities")]
public string City3 = "San Diego";
}
var catalog = new PackageCatalog();
catalog.AddPackage(Package.Current);
Package.DownloadPackageAsync(new Uri("ExtendingApplication.xap", UriKind.Relative), (s, p) => catalog.AddPackage(p));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
PackageCatalog catalog = new PackageCatalog();
public MainPage()
{
InitializeComponent();
GetData.Click += new RoutedEventHandler(GetData_Click);
Cities = new ObservableCollection<string>();
//var catalog = new PackageCatalog();
catalog.AddPackage(Package.Current);
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
OurTextBox.Text = CityName;
LayoutRoot.DataContext = Cities;
}
void GetData_Click(object sender, RoutedEventArgs e)
{
Package.DownloadPackageAsync(new Uri("ExtendingApplication.xap", UriKind.Relative), (s, p) => catalog.AddPackage(p));
}
public interface IModel
{
string getData();
}
public class ModelHolder
{
[Export]
public IModel OurModel = new DataModel();
}
public class DataModel : IModel
{
#region IModel Members
public string getData()
{
return "Moscow";
}
#endregion
}
[Import]
public IModel OurModel { get; set; }
//...
OurTextBox.Text = OurModel.getData();
This guide is based on Brad Abram's post.
Glenn is deeply involved with MEF as well. His blog is here.