今天试了一下在WinRT中使用MEF,这里简单的介绍一下步骤。
首先,使用NuGet安装MEF
然后,就可以使用MEF组装插件了,简单的示例如下:
interface ILogger
{
void LogMessage(string msg);
}
[Export(typeof(ILogger))]
class
Logger : ILogger
{
public
void LogMessage(string msg)
{
Debug.WriteLine(msg);
}
}
public
sealed
partial
class
MainPage : Page
{
[Import]
ILogger logger { get; set; }
public MainPage()
{
this.InitializeComponent();
Compose();
logger.LogMessage("main page created");
}
private
void Compose()
{
var configuration = new
ContainerConfiguration()
.WithAssembly(this.GetType().GetTypeInfo().Assembly);
var compositionHost = configuration.CreateContainer();
compositionHost.SatisfyImports(this);
}
}
虽然大体上和.Net中使用类似,不过一个比较明显的区别的是组装方式不同了。目前看来,只能使用SatisfyImports,而不能使用ComposeParts方法。这样就无法将成员导出了,由于这个强大的成员缺席,感觉基本上废了一半。好在WinRT程序基本上不太复杂,勉强还凑合能用。希望后续能够支持ComposeParts方法。
除此之外,WinRT下缩水的部分还不少。例如,不能再Field或property上使用Import或Export,没有InheritedExport,这些都是非常实用的功能。导致WinRT上使用的时候有些束缚非常大的感觉,希望后续能得到进一步的完善。