本文主要说明在Modern UI框架下使用MEF的必要步骤,关于MEF请自行脑补。
MEF-INTO-MUI实例代码下载: MefMuiApp.zip
1:创建一个导出属性
ModernFrame用来承载在MUI应用中显示的内容。内容是通过URI标识的,我们需要通过MEF来标记一段内容是被导出的,同时提供一个可供访问的URI标识,这可以通过元数据实现。
下面的ContentAttribute类继承自ExportAttribute,并添加了一个CotentUrl元数据属性,契约规定可导出的内容必须继承IContent接口。
为了能在MEF中使用强类型元数据,我们也定义了一个IContentMetadata接口,在后面将会用到
2:导出内容
下一步我们需要做的就是使用ContentAttribute来标记可被导出的内容页面,并且每一个页面都必须继承IContent接口。
下面的代码演示了将可被导出的MyPage指定URI为"/MyPage"。
3:继承contentLoader
我们现在需要定义一个IContentLoader的实现,能够接收导出的内容,并根据内容的URI返回接口。为此我们创建新的从DefaultContentLoader派生的MEFContentLoader,这个加载器可以导入包含了IContentMetadata和继承了IContent接口的导出内容,这样我们就可以通过URI访问了。
当通过LoadContent方法请求时,请求的uri会和元数据进行匹配,成功后内容就会被返回。Content实例通过Lazy进行延迟加载。
请注意MefContentLoader本身也有出口。
4:把他们放在一起
所有必须的元素已经准备就绪,我们现在要做的就是确保所有的Modern控件使用新的MefContentLoader而不是默认的contentLoader,在App.xaml中添加下面的默认样式。动态资源的引用问题将在后面解决。
MEF在应用启动时进行组合,将下面的代码添加到应用启动方法中(App.xaml.cs的OnStartup方法)
MEF组合需要创建的程序集目录并将其填充到CompositionContainer容器中,从容器中检索MefContentLoader实例并将其添加到全局应用程序资源字典中,一旦这个加载器被加载,在默认样式中使用动态资源的问题就被解决了。
就是如此。每当ModernFrame需要加载内容时,它就用在默认样式中定义的MefContentLoader,MefContentLoader根据ContentUri在导出的元数据中进行查找。